brand: Problem mit regulären Ausdrücken

Beitrag lesen

Hi!

Heute in der Nacht (so um ca. 2 Uhr) habe ich eine Lösung gefunden - nur ein Problem habe ich immer noch *grml*

Die Lösung: eregi_replace("/@ ([^<]+) @/","<b>\1</b>",$string);

Ich fürchte, daß das nicht die Lösung ist (außer du hast im string nur maximal einen Bereich der fett dargestellt werden soll.

Ich weiß nicht, ob dir ganz klar ist, welche Treffer diese Abfrage findet?

Du suchst also nach Zeichenketten, die mit "/@ " beginnen und mit " @/" enden,
dazwischen darf alles vorkommen außer einem "<".

Hast du nun in dem String den du durchsuchst mehrere "/@" und "@/" so ist die Maske nicht eindeutig, in diesem Fall wird als Ergebnis die längste gefundene Zeichenkette, die dieser Maske entspricht, ausgegeben.

Bsp:

"Das ist ein /@ Test @/!!!" wird zu "Das ist ein <b>Test</b>!!!" (das paßt ja
soweit)

ABER:

"/@ Das @/ ist ein /@ zweiter Test @/!!!" wird zu "<b>Das @/ ist ein /@ zweiter Test</b>!!!" ...hier gibt es nämlich zwei Lösungen, die der Maske entsprechen - einmal zwei kurze "Das" und "zweiter Test" und einmal eine lange "Das @/ ist ein /@ zweiter Test" -> und genau diese wird als Ergebnis ausgegeben werden.

Weiters würde ein "/@ Maus < Elefant @/" keinen Treffer erzielen, da du in der
Liste [^<] ja das "<" ausschließt.

»»wie kann ich alle Zeichen verwenden ohne irgendetwas auszuschließen?

Damit kein Zeichen ausgeklammert wird kannst du "(.+)" statt dem "([^<]+)" verwenden.

der Punkt "." ist quasi ein Platzhalter für irgendein Zeichen und das Plus "+" dahinter bedeutet, daß mindestens ein Zeichen an dieser Stelle vorkommen muß (es können aber auch mehr sein).

noc viel Spaß beim tüfteln ;-)

BRAND