2017-02-13 8 views
1

Ich habe folgende Voraussetzung.Wie Bindestrich in Ausgabe String mit preg_replace

Eingang ----------: z-edu-l1-^threat -emergency mk pl.jpg

Pflicht ----: z-edu-l1-_threat_-emergency_mk_pl.jpg

Ich verwende folgende

$input = 'z-edu-l1-^threat -emergency mk pl.jpg'; 

echo strtolower(preg_replace('/\W(?![^.-]*$)/', '_', trim($input))); 

I-Ausgang folgende erhalten

z_edu_l1__threat__emergency_mk_pl.jpg 

Ich möchte das - Symbol nicht durch Unterstriche ersetzen. Wie behalte ich den Bindestrich in der Ausgabezeichenfolge mit preg_replace?

+0

sollten Sonderzeichen auch entfernt werden weiter? – RomanPerekhrest

+0

@RomanPerekrest ja Sonderzeichen sollten ebenfalls entfernt werden. – Muk

Antwort

3

Sie ersetzen kann \W mit seiner negierten Zeichenklasse äquivalent [^\w] und negiert die Symbole, die Sie erhalten müssen:

[^\w.-] 

Siehe die regex demo

Die [^\w.-] Matches jedes Zeichen, das keinen Buchstaben/Ziffer , _, . und -.

Siehe PHP demo:

$input = 'z-edu-l1-^threat -emergency mk pl.jpg'; 
echo strtolower(preg_replace('/[^\w.-]/', '_', trim($input))); 
// => z-edu-l1-_threat_-emergency_mk_pl.jpg 
1
$input = "z-edu-l1-^threat -emergency mk pl.jpg"; 
$output = str_replace(["^", " "], "_", $input); 
echo $output; 
//output 
//z-edu-l1-_threat_-emergency_mk_pl.jpg 
+0

Während dieses Code-Snippet willkommen ist und vielleicht etwas Hilfe bietet, wäre es [erheblich verbessert, wenn es eine Erklärung enthielt] (// meta.stackexchange.com/q/114762) von * wie * und * warum * das löst das Problem Problem. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, nicht nur die Person, die jetzt fragt! Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung hinzuzufügen und geben Sie an, welche Einschränkungen und Annahmen gelten. –

1

[^ etwas] eine Übereinstimmung mit Ausnahme {etwas} \ w finden -> Alphabete [^ \ W.-] wird alles außer alpha finden, Punkt und Bindestrich und ersetzen Sie es durch Unterstrich.

$input = 'z-edu-l1-^threat -emergency mk pl.jpg'; 

echo strtolower(preg_replace('([^\w.-])', '_', trim($input))); 

eine Live demo here

+0

Danke für deine Antwort - eine Erklärung deines Regulären Ausdrucks, und wie es die OP-Frage löst, wäre hilfreich – Tom

+0

In welcher Weise unterscheidet sich das von @ WiktorStribiżews Antwort? – Toto

+0

@Toto Ich habe seine Antwort nicht gesehen. Während ich antworte und teste es auf phpfidle, wurden keine Antworten erhalten. Nach dem Absenden sah ich nur die Antwort. –

Verwandte Themen