Regulärer Ausdruck mehrere Muster passend
-
05-07-2019 - |
Frage
$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);
Der Ausgang ich will, ist example.com/folder
aber alles, was ich bekommen jetzt ist example.com..folder
Ich weiß, das ist, weil ich nicht die richtigen RegexMuster habe, aber was würde das Muster sein?
Lösung
Ändern Sie die Reihenfolge der '/--/'
und '/-/'
Muster, so dass '/--/'
zuerst geprüft wird, sonst '/-/'
Willen Trumpf '/--/'
. Sie nicht die Arrays im Aufruf zu interpolieren preg_replace
.
$url = "example-com--folder";
$searchArray = array('/--/', '/-/');
$replaceArray = array('/', '.');
$url = preg_replace($searchArray, $replaceArray, $url);
Alternativen:
- Verwenden Sie mehrere Anrufe, die Sie in der Reihenfolge
preg_replace
wollen die REs bewerten. Das ist nicht so verwerflich wie Sie vielleicht denken, weilpreg_replace
über den Arrays Schleifen und behandelt jedes RE wiederum. -
Verwenden Sie einen ausgewerteten Ersatz
$url = "www-example-com--folder"; $replacements = array('-' => '.', '--' => '/'); $url = preg_replace('/(--?)/e', '$replacements["$1"]', $url);
-
Verwenden Sie einen Look-Ahead und Lookbehind
$url = "www-example-com--folder"; $searchArray = array('/(?<!-)-(?!-)/', '/--/'); $replaceArray = array('.', '/'); $url = preg_replace($searchArray, $replaceArray, $url);
Andere Tipps
Das ist PHP, nicht wahr?
Sie benötigen einen quantifier angeben, dass Sie genau zwei Bindestriche in dem zweiten Muster wollen. Versuchen Sie:
$searchArray = array('/-/','/-{2}/');
Die geschweiften Klammern sagen erfordern genau n des vorhergehenden Musters '
Hier ist ein gute Referenz .
Sehen Sie, wenn dies funktioniert:
$url = "example-com--folder"; $searchArray = array('([^-])-([^-])','--'); $replaceArray = array('$1.$2','/'); $url = preg_replace("$searchArray", "$replaceArray", $url);
, was dieser sagt „jede übereinstimmen - das ist nicht ein Strich hat vor oder nach und ersetzen, dass mit ein.“ und „entsprechen doppelt - mit /“. Natürlich können Sie diese erweitern das zweite Spiel auf zwei Striche zu begrenzen nur durch Zugabe von ([^ -]) an dem von vorn und hinten. wie es ist, „-----“ wird „//“, die Sie nicht möchten.