die Funktion preg_replace ist ja sehr mächtig aber auch nicht so einfach mit den vielen regulären Ausdrücken.
Wie kann ich mit obigen Befehl in einem String ein oder mehrere (an verschiedenen Stellen) {#S:dateiname.jpg} abändern?
Beispiele:
$a = „Ich bin {#S:dateiname.jpg} KB groß“;
$b = „{#S:dateiname1.jpg} KB bin ich und du hast ganze {#S:dateiname2.jpg} KB“;
Später soll in den Variablen anstatt {#S:…} die Dateigröße stehen. Wie ich die Dateigröße ermittle weiß ich. Wie ich das aber nun perfekt mit preg_replace löse ist mir nicht so ganz klar, da ein String auch mehrere solcher {#S:…} enthalten kann. Und das an ganz verschiedenen Stellen.
$a = „Ich bin {#S:dateiname.jpg} KB groß“;
$b = „{#S:dateiname1.jpg} KB bin ich und du hast ganze
{#S:dateiname2.jpg} KB“;
was soll das den für ein beispiel sein ? $a $b und unterschiedliche namen ?
also erstmal nehmen wir an wir haben einen text
$a =
und nun ist noch die Frage ob die Dateinnamen bekannt sind oder erst erkannt werden sollen , also
/* alle ergebisse holen , keine Ahnung ob das nun so passt*/
preg_match_all(/{#S:.*[^]…{3}}/,$wodrinne,$erg)
/* nun für jeden fund gucken welche kb und ändern im text */
foreach ($erg as $ein) {
/* fehlt: dateinamen extrahieren und escapen */
/* funktion zum ermitteln der kb */
$kb = kbvondatei($ein);
/* daten ersetzen */
preg_replace(’/’.$ein.’/’,$kb,$a);
}
und nun ist noch die Frage ob die Dateinnamen bekannt sind
oder erst erkannt werden sollen , also
/* alle ergebisse holen , keine Ahnung ob das nun so passt*/
preg_match_all(/{#S:.*[^]…{3}}/,$wodrinne,$erg)
Erst mal DANKE!
Ja, sie müssen noch erkannt werden. Der String kommt aus einer Datenbank. Es sind Blogbeiträge und wie gesagt, die Anzahl der „{#S…}“ sind immer verschieden.
Das „preg_match_all“ macht noch ein Fehler. Da ich mich mit den regulären Ausdrücken nicht so auskenne, kann ich das leider nicht ausbessern. Die Fehlermeldung lautet:
Parse error: syntax error, unexpected ‚/‘, expecting ‚)‘ in C:\Apache2\htdocs\blog.php on line…
/* alle ergebisse holen , keine Ahnung ob das nun so passt*/
preg_match_all(/{#S:.*[^]…{3}}/,$wodrinne,$erg)
Erst mal DANKE!
Ja, sie müssen noch erkannt werden. Der String kommt aus einer
Datenbank. Es sind Blogbeiträge und wie gesagt, die Anzahl der
„{#S…}“ sind immer verschieden.
Das „preg_match_all“ macht noch ein Fehler. Da ich mich mit
den regulären Ausdrücken nicht so auskenne, kann ich das
leider nicht ausbessern. Die Fehlermeldung lautet:
das hat aber jetzt nix mit dem regulären ausdruck zu tun sondern ist schlicht eine fehlermeldung die wenn du mal bei http://php.net/manual/de/function.preg-match-all.php nachgeguckt hättest selber entdecken können.
Ach was , du kannst es immer noch selber entdecken .
Parse error: syntax error, unexpected ‚/‘, expecting ‚)‘ in
C:\Apache2\htdocs\blog.php on line…
Gruß Mike
syntax error haben noch nix mit dem regulären ausdruck an sich zu tun , eher muss es ein string sein … also mach ein string draus .
muss eh noch einiges gemacht werden : z.b. doppelte raus suchen.
{ = Klammer auf
# = Nummernzeichen
S = Buchstabe S
: = Doppelpunkt
.* = alle zeichen
[^] = keine Leerzeichen (sonst gäbe es vielleicht längere matches)
. = der Punkt
.{3} = genau 3 zeichen (also jpg gif png … )
} = Klammer zu
/ = begrenzer
also
{#S:XXXXxxxx.xxx}
wobei hier XXXXxxxx keine feste länge hat (ausser das es kein leerzeichen haben darf ). Das mit dem leerzeichen ist nicht die netteste version , da es ja leider auch dateinamen mit leerzeichen geben könnte . Mir viel aber nix anders ein um einen grösseren match zu unterbinden .
Beispiel eines Grösseren Matches wäre
tut tut {#S:XXXXxxxx.xxx} bal bal bal bal {#S:XXXXxxxx.xxx} tut tut
hier würde ja
tut {#S:…xxx} tut
auch gelten , wenn ich eben nicht das leerzeichen als begrenzer nutzen würde . Musst du testen was wie geht.