preg_replace. kann jemand helfen?

Hallo,

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.

Kann mir da jemand helfen?

Gruß Mike

Moin moin ,

Beispiele:

$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…

Gruß Mike

/* 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.

Das mit den Anführungszeichen… wie peinlich :smile:

Deine Hilfe habe ich jetzt so gemacht:

preg_match_all("/{#S:.*[^]…{3}}/",$ct,$erg);
foreach ($erg[0] as $ein)
{
$a = „blog/fotos/“.substr($ein,4,-1);
$kb = filesize($a) / 1024;
$kb = strval(round($kb, 2)) . " KB";
$ct = str_replace($ein,$kb,$ct);
}

Das „$erg“ ein Array ist, versteh ich zwar gerade nicht aber ich musste dann bei der foreach-schleife es in „$erg[0]“ abändern.
So geht’s. Vielen Dank

wenn du was nicht verstehst dann schau dir das array an

var_dump($variable);

dann siehst du was in $variable so steckt .

nochmal eben den regex erklären

/{#S:.*[^]…{3}}/

/ = begrenzer

{ = 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.

danke noch zu den regex-infos und diesen var_dump
Micha