reg. Ausdrücke suchen & ersetzen
harald
- php
Hi!
Wie kann ich einen str. nach reg. Ausdrücken durchsuchen und diese dann ersetzen?
=> $string = "Dies ist ein 'Test'-String";
gesucht soll dann nach dem reg. Ausdruck "!'(.*)'!U" werden, ersetzt solln sie durch '"'.[vorheriges (.*)].'"' werden.
Wie kann ich das machen?
Danke
Harald
Was du suchst ist preg_replace('Ausdruck','Ersetzen','Original-String'). Mittels $0-99 kannst du dann auf verschiedene Treffer zugreifen, wobei $0 für alles und $x für den Inhalt der x-ten Klammer steht. Diese "Variablen" sind allerdings als String im zweiten Argument abzuliefern.
Da hab ich aber dann immer nur Teile, wie bekomm ich denn dann wieder alles vor, in, und nach den Klammern?
lg
harald
Da hab ich aber dann immer nur Teile, wie bekomm ich denn dann wieder alles vor, in, und nach den Klammern?
Das brauchst Du nicht, weil sich die Ersetzung nur auf die gefunden Teile beschränkt.
Was soll Dein Code
=> $string = "Dies ist ein 'Test'-String";
gesucht soll dann nach dem reg. Ausdruck "!'(.*)'!U" werden, ersetzt solln sie durch '"'.[vorheriges (.*)].'"' werden.
bewirken? Eine Suche nach .*? findet in Deinem Beispiel alles. Ist das wirklich so gedacht? Vermutlich nicht. Wenn doch, reichen einfache Stringoperationen.
ich suche ja nicht nach (.*), sondern nach '(.*)' => Text der in ' eingeklammert is, das is auch nur ein vereinfachtes Bsp., es geht darum dass ich Teile in einem str. mit reg. Ausdrück suchen & ersetzen will und danach den GANZEN str. mit den ersetzten teilen drinnen haben will...
thx
harald
ich suche ja nicht nach (.*), sondern nach '(.*)' => Text der in ' eingeklammert is,
Dein Suchausdruck war "!'(.*)'!U"
Die ' habe ich übersehen, sorry. Trotzdem: Du mußt schon konkreter werden, was Du eigentlich willst, sonst wird Dir vermutlich keiner helfen können. Dein Ersetzungs-Pattern
'"'.[vorheriges (.*)].'"'
ist mir unverständlich. Schreib zumindest den Ausgangsstring (wenn nötig als Beispiel, das hast Du aber bereits getan) und den String, wie er am Ende aussehen soll. Dann ist es einfacher nachzuvollziehen.
also ich hab folgenden txt
str = "Hier kommt die ID:[id=276]";
$str = preg_replace("![id=(1-9*)]!U", '<a href="...?$1">'.$id_namen[$1].'</a>', $str);
echo str;
jetzt sollte "Hier kommt die ID:<a href="...?$1">Hannes</a>" erscheinen.
Doch es passiert gar nix...
lg
harald
Hi,
also ich hab folgenden txt
str = "Hier kommt die ID:[id=276]";
$str = preg_replace("![id=(1-9*)]!U", '<a href="...?$1">'.$id_namen[$1].'</a>', $str);
Das 1-9 muss in eckige klammern. Momentan suchst du nach dem String "1-9". Wenn es vorkommen kann, dass die id eine 0 enthält (z.B. 205) müsstest du dann "[0-9]*" (oder kürzer "\d*") dafür schreiben.
echo str;
jetzt sollte "Hier kommt die ID:<a href="...?$1">Hannes</a>" erscheinen.
Doch es passiert gar nix...
Weil dein Muster nicht passt.
mfG,
steckl
stimmt, jetzt wirds erkannt, aber den namen erkennt er so ned...
Wie kann ich den den Inhalt der var $1 in nem array nutzen?
=> $id_namen[$1] funktioniert ned...
thx
Harald
Hi,
stimmt, jetzt wirds erkannt, aber den namen erkennt er so ned...
Wie kann ich den den Inhalt der var $1 in nem array nutzen?
=> $id_namen[$1] funktioniert ned...
Ich kann nicht sehr gut PHP, aber es sollte doch so funktionieren, wie du oben geschrieben hast.
Wie sieht der komplette Aufruf aus und welches Fehlverhalten tritt auf?
mfG,
steckl
Es kommt kein fehler, er setzt nur nix ein...
lg
Harald
also ich hab folgenden txt
str = "Hier kommt die ID:[id=276]";
$str = preg_replace("![id=(1-9*)]!U", '<a href="...?$1">'.$id_namen[$1].'</a>', $str);
echo str;jetzt sollte "Hier kommt die ID:<a href="...?$1">Hannes</a>" erscheinen.
Doch es passiert gar nix...
Schon klar. Sind auch mehrere Fehler drin.
preg_replace("/[(id=[1-9]*?)]/", ' <a href="...?$1">', $string)
danke, doch das hab ich schon...
Aber wie kann ich denn das >'.$id_namen[$1].'< aus den Ersatz-String berichtigen?
Danke
Harald
danke, doch das hab ich schon...
Aber wie kann ich denn das >'.$id_namen[$1].'< aus den Ersatz-String berichtigen?Danke
Harald
preg_match("/[id=([1-9]*?)]/", $str, $index);
$str = preg_replace("/[(id=[1-9]*?)]/", ' <a href="$1">' . $id_namen[$index[1]] . "</a>", $str);
Das ganze funktioniert dann aber nur bei einer ersetzung, nicht wenn der id-tag öffter vorkommt!
Geht das auch irgendwie für mehrere male?
Geht das auch irgendwie für mehrere male?
Vermutlich ja. Wenn man genauer wüßte, was Du vorhast, könnte man auch sagen, wie. So bleibt nur ein geratenes preg_match_all oder Schleifen.
naja, ich möchte eine Kommentareingabe anbieten, und dort soll man durch die Eingabe von [name=Hubert] auf z.B. die Seite von Hubert verlinken können, daher solln alle [name=(.*)] verarbeitet werden...
lg
Harald
naja, ich möchte eine Kommentareingabe anbieten, und dort soll man durch die Eingabe von [name=Hubert] auf z.B. die Seite von Hubert verlinken können, daher solln alle [name=(.*)] verarbeitet werden...
Mann, Dir muß man ja alles aus der Nase ziehen. Das ist immer noch nur eine halbwegs vernünftige Beschreibung. Wenn es darum geht, daß in einem Kommentarstring $comment die Zeichenfolge [name=.*?] öfter vorkommen kann, ist preg_match_all das Mittel der Wahl.
Entschuldige, ich dachte das ich eh schon mal geschrieben hab, dass es öfter ersetzt werden soll...
Stimmt das nun so?
preg_match_all("/[id=([1-9]*?)]/", $str, $index);
while($index as $replace)
$str = preg_replace("[id=".$replace[1]."]", ' <a href="'.$replace[1].'">' . $id_namen[$replace[1]] . "</a>", $str);
DANKE
Harald
Hi,
Da hab ich aber dann immer nur Teile, wie bekomm ich denn dann wieder alles vor, in, und nach den Klammern?
Du musst alles was du wieder einsetzen willst in Klammern schreiben. Alles was nicht auf den regulären Ausdruck passt wird sowieso nicht geändert.
Kannst du nochmal deinen Code mit preg_replace posten?
Ausserdem solltest du statt nach '(.*)' vielleicht nach '(.*?)' suchen, da der Ausdruck sonst alles vom ersten bis zum letzten ' findet.
Stichwort: gieriges Verhalten
mfG,
steckl