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?

War es hilfreich?

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, weil preg_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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top