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