suchen und ersetzen
hanns
- php
0 Felix Riesterer0 hanns
0 Ashura0 hanns
hallo
ich habe in einem dokument mehrere strings der form:
dddddddxxhhhh. also die ddddddd-komponente und die hhhh-komponente
sind immer identisch, nur das xx variiert, weil es eine zahl ist.
nun möchte ich NUR die xx kompentente durch xxbbb ersetzen, wobei
bbb immer etwas konstantes ist ... wie kann ich das machen???
gruss
hanns
Lieber hanns,
mit preg_replace geht das spielend leicht. Dazu müsstest Du Dich ein klein wenig mit regulären Ausdrücken auskennen.
Beispiel:
$string = 'alle-meine-Entchen-25-schwimmen-auf-dem-See';
$ersetzung = '(Stück)';
$ergebnis = preg_replace('~^(.*\D\d\d)(\D.*)$~', '\\1'.$ersetzung.'\\2', $string);
Obiges sollte dieses ausgeben: "alle-meine-Entchen-25(Stück)-schwimmen-auf-dem-See"
Dabei gehe ich in meinem Suchmuster davon aus, dass es sich um exakt zwei Ziffern (\d bedeutet Ziffer) handelt, denen eine Nicht-Ziffer (\D) vorausgeht, und auf die ebenso eine Nichtziffer folgt. Ein Punkt bedeutet "irgendein Zeichen", wobei standardmäßig Zeilenenden nicht gemeint sind. Das Sternchen hinter dem Punkt (also "irgendein Zeichen") bedeutet "beliebig viele davon, auch keines".
Die Klammern bedeutet "merke Dir das". Ich kann dann mit \1 auf den gemerkten Inhalt der ersten, und mit \2 auf dem gemerkten Inhalt der zweiten Klammer zurückgreifen (siehe zweites Argument der Funktion).
Liebe Grüße aus Ellwangen,
Felix Riesterer.
vielen dank!
es können allerdings beliebig viele ziffern sein, also
die zahlen von 1 bis 100.000
ich werde mal sehen, was ich damit machen kann.
vielen dank!!!!
lieber felix riesterer,
es hat geklappt :-) ... aber nur, weil du
die erklärungen dazu geschrieben hast.
danke.
Lieber hanns,
es hat geklappt :-) ... aber nur, weil du
die erklärungen dazu geschrieben hast.
das freut mich! Ich liebe diese regulären Ausdrücke, da sie einem das Leben um soooovieles leichter machen!
danke.
Gern geschehen. Sieh Dir ruhig auch mein neues Beispiel an. ;-)
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Lieber hanns,
es können allerdings beliebig viele ziffern sein, also
die zahlen von 1 bis 100.000
wenn diese Ziffern ohne Punkte dazwischen stehen, dann kann man das Suchmuster entsprechend einfach modifizieren:
$string = 'alle-meine-Entchen-25-schwimmen-auf-dem-See';
$ersetzung = '(Stück)';
$ergebnis = preg_replace('~(\D+\d+)(\D+)~', '\\1'.$ersetzung.'\\2', $string);
Ich habe nun meinem Muster gesagt "mindestens eine (das Pluszeichen) Nicht-Ziffer, gefolgt von mindestens einer Ziffer in Klammer 1 merken".
In meinem ersten Vorschlag hatte ich noch den Anfang (^-Zeichen) und das Ende ($-Zeichen) eingetragen, da aus Deinem ersten Posting anscheinend nur ein einziges Vorkommen gemeint war. Nach Deiner Antwort auf Ashura hin zu schließen ist dem wohl nicht so...
Wenn Du nun feste Stringbestandteile hast, dann kann man anstatt \D ebendiese einsetzen (nur auf Zeichen mit besonderen Bedeutungen achten).
Neues Beispiel:
$string = 'Das kostet €123456,25 bei mir.';
$ersetzung = ' (günstig, nicht wahr?!)';
$ergebnis = preg_replace('~(€\d+(?:[.,]\d+)?)( bei mir)~', '\\1'.$ersetzung.'\\2', $string);
Zeichen innerhalb von eckigen Klammern werden als Alternativen für ein einzelnes Zeichen verstanden. In meinem neuen Beispiel kann also auch eine Dezimalzahl mit Komma oder Punkt gefunden werden. Ein Fragezeichen bedeutet "höchstens einmal, also auch keinmal", und ermöglicht damit Ganzzahlen, als auch Dezimalzahlen, da der gesamte Ausdruck in der zweiten Klammer (die wegen des "?:" nicht behalten wird) nicht vorkommen muss, aber kann.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo hanns.
ich habe in einem dokument mehrere strings der form:
dddddddxxhhhh. also die ddddddd-komponente und die hhhh-komponente
sind immer identisch, nur das xx variiert, weil es eine zahl ist.nun möchte ich NUR die xx kompentente durch xxbbb ersetzen, wobei
bbb immer etwas konstantes ist ... wie kann ich das machen???
$str_deine_zeichenkette = 'dddddddxxhhhh';
$str_deine_zeichenkette = [link:http://de2.php.net/manual/en/function.str-replace.php@title=str_replace]('hhhh', 'bbbhhhh', $str_deine_zeichenkette);
echo $str_deine_zeichenkette; // dddddddxxbbbhhhh
Einen schönen Freitag noch.
Gruß, Ashura
hallo und vielen dank,
ich glaube, dass ich mein problem nicht ganz klar geschildert habe.
also ich habe sagen wir folgenden text, wobei x immer für eine ziffer steht:
dlkfjdlkfj dddxxhhh jhhh kdjf kdjf kjk ddd kdj fkddd klj lkhhh dddxhhh kdjkjddd kkljddd lökjhhhhhh dddxxxxxhhh kjkdjkj hhh xxx lkjlkj xx lkjlkjxxxxx
nun möchte ich, dass NUR diejenigen xx bzw. xxxxx etc. ersetzt werden, die direkt von ddd und hhh umgeben sind. alle anderen nicht.
also dddxxxhhh beispielsweise soll ersetzt werden durch dddxxxERSETZUNGSTEXThhh