Ich versuche, gemeinsam Masken aus einem String zu erstellen, wie so:Wie kann ich mehrere Zeichenfolgen in einer Zeichenfolge ohne überlappende Ergebnisse ersetzen?
012abc.d+e_fg~hijk => 012{start}.d+{middle}_fg~{end}jk
ersetzen:
$arrFromTo = array(
'st' => '{pre}',
'abc' => '{start}',
'e' => '{middle}',
'hi' => '{end}',
'dd' => '{post}'
);
Stattdessen halte ich Ersatz überlappende und stattdessen etwas wie diese erhalten (mit einer Schleife von str_replace
' e):
012{{pre}art}.d+{mi{post}le}_fg~{end}jk
Da die st
in der bereits gefunden wird ersetzt {start}
und dd
ist in {middle}
gefunden.
Wie würden Sie das Folgende ersetzen?
$str = 'abc.d+e_fg~hijk';
echo replace_vars($str); // Desired output: 012{start}.d+{middle}_fg~{end}kJ
Ich dachte, das Array neu anzuordnen, so dass "dd" => "{post}" in einer anderen Position war, aber das brachte andere Probleme. –
Es ist nicht oft, dass ich regex vorschlage, aber in diesem Fall könnte es ratsam sein, Lookahead/Behinds durchzuführen, um zu überprüfen, was Sie erwarten, bevor Sie ersetzen –
@scrowler Leider gibt es einen Fehler in meiner PCRE-Bibliothek mit negativen Look-Backs variabler Länge. Ich kann die PCRE-Bibliothek nicht aktualisieren, daher habe ich an dieser Stelle den Pfad nicht mehr fortgesetzt. – Ryan