Carsten: Script funktioniert nur fast 100% (nur bei 1 Treffer)

Beitrag lesen

Hi Steffi,

hier das aber schon nicht mehr. Einzige Unterschied: es wäre zweimal zu ersetzen.

$test = "xxx [bild:logo1.jpg] xxx [bild:logo2.jpg] xxx";
              $bla = ereg("[bild:(.*)]",$test,$regs);

Das Sternchen (.*) ist gierig (greedy). Das heist es frisst erstmal alles weg, dann
werden nach und nach Zeichen wieder rausgelassen, bis es passt. Bei deinem Beispiel
'matched' es also folgendermaßen:

bild:logo1.jpg] xxx [bild:logo2.jpg
weil  [                                   ]  hier die eckigen Klammern stehen.

Abhilfe:

ereg("[bild:([^]*)]",$test,$regs);

würde jedes "nicht ]" Zeichen matchen (also bis zur Klammer zu). Leider funktioniert
das nicht (Ich weiss nicht warum). Aber

ereg("[bild:([^\n ]*)]",$test,$regs);

geht. Dann darf das * nur bis Zeilenende oder Leerzeichen fressen, es muss also
immer ein Leerzeichen oder ein Zeilenende zwischen den geklammerten Ausdrücken stehen.

Oft wird die Verwendung von preg_xxx() statt der ereg() Ausdrücke empfohlen, weil die
schneller sind und mehr können. Die Syntax ist fast die gleiche (und steht auch
im PHP Manual)

preg_match("=[bild:([^]\n ]*)]=",$test,$regs);

funktioniert.
(Die "=" sind einer der Syntax-unterschiede, denk sie dir einfach weg, sie tun erstmal nix)

und es kommt noch besser

preg_match("=[bild:(.*?)]=",$test,$regs);

funktioniert auch. Das ? treibt dem Sternchen die Gierigkeit aus.

Gruss,
Carsten