2016-09-16 1 views
1

i denken, wie kann ich so letztes Element von Formularnamen zu ersetzen:PHP: Ersetzen von Text in den letzten Klammern in String

content[1] 
content[1][officeImage] 
content[2][officeImage] 
content[3][something][officeImage] 
... 

Tiefe von „array“ unendlich sein kann, und ich ersetzen muß von ihm zuletzt wie Dies ist:

content[replaced] 
content[1][replaced] 
content[2][replaced] 
content[3][something][replaced] 
... 

Ist hier jemand, der preg_replace() oder etc schreiben kann? Dank

Edit:

ich dieses:

preg_replace('~\[.*!?\]~', '[replaced]', $parent); 

Aber es Rückkehr von "content[1][officeImage]" this "content[replaced]": [

+0

innerhalb einer Variablen, den letzten Punkt holen und Sie können nach Ihrem Plan spielen –

+0

poste deine Versuche/.. –

+2

Ist es ein Array oder ein wörtlicher Text? – revo

Antwort

3

Try this:

preg_replace('~^.*\[\K[^]]+~m', 'replaced', $parent); 

DieDer Modifikator(mehrzeilig) ist nur erforderlich, wenn $parent mehrere Zeilen enthält, die gleichzeitig ersetzt werden müssen.

Der große Trick hier beginnt mit ^.*\[\K. Dies sagt alles beginnend mit dem Anfang der Linie bis zu einem \[. Da dies eine "gierige" Wiederholung ist, wird es bis zur letzten Instanz weitergehen (. passt nicht zu den Zeilenvorschüben ohne den Modifikator s). Die \K schmeißt alles zusammen, so ersetzen wir nur, was in den Klammern ist.

+1

Ich wusste nicht über' \ K', ich werde es mir ansehen! Ein großes Lob an Sie :) –

+0

PCRE-only, aber es kann effizientere Abfragen weniger kompliziert in solchen Fällen machen. Du könntest ohne '\ K' hier wegkommen, indem du' ~^(. * \ [) [^]] + ~ M' durch '\ 1 [ersetzt] ersetzt. Weniger elegant. – Sam

+1

Haha, ich habe das gerade gefunden: preg_replace ('~. * \ K \ [. *!? \] ~ S', '$ 1'. '[Ersetzt]', $ Eltern); Was ist der Unterschied? – landsman

0

können Sie diesen Code verwenden:

$re = "/\\[([^]]*)\\][^]]*$/m"; 
$str = "content[1]\ncontent[1][officeImage]\ncontent[2][officeImage]\ncontent[3][something][officeImage]"; 
$subst = "[replacement]"; 

$result = preg_replace($re, $subst, $str); 

anzeigen live PHP oder live Regex

+0

Definitiv ein praktikabler Ansatz, aber das wiederholte Anpassen von '[]' Sätzen fügt mehr Schritte als nötig hinzu. (Nur ein Hinweis an das OP.) – Sam

0

Versuchen Sie folgende:

$string = 'content[3][something][officeImage]'; 
$replaced = 'somestring'; 
$result = preg_replace('/(.*\[)(.*?)]$/m','$1'.$replaced.']',$string); 
+1

Fügen Sie den Modifikator 'm' hinzu, damit dieser Ausdruck mit mehreren Eingabezeilen gleichzeitig funktioniert. – Sam