MudGuard: Reguläre Ausdrücke - String ausschließen

Beitrag lesen

Hi,

Die Capturing Klammern, die um das 'a(?:rea)?' bzw. 'a|area' außenrum sind, haben damit nichts zu tun.

Na eben!

Eben. Das (?:) sorgt dafür, daß keine "Backreferenz" für diese Klammer erzeugt wird.

Die Capturing Klammern außenrum haben damit, wie erwähnt, nichts zu tun. Sprich: für diese wird selbstverständlich nach wie vor der gesamte vom Inhalt gematchte Teilstring gemerkt.

Das ?: führt ja auch dazu, dass das Argument _nicht_ in die Ergebnismengen aufgenommen wird.

Es sorgt dafür, daß für diese Klammer keine eigene Backreferenz erzeugt wird.

$pattern1= '#<(a|area)\s*.*href=("|')(?!javascript:|mailto:)(\S*)\2\s*([^>]*)>(.+)</\1>#Ui';

das (a|area) wird hier benötigt, um nachher auch den Linktext einfangen zu können,

Nein, die wird benötigt, um das schließende Tag zu finden.
Daß das bei area nicht funktionieren kann, ist Dir aber klar? area ist ein leeres Element.

Das Ende des Ausdrucks sollte also

(?:(.+?)</\1>)?

lauten, sprich: alles nach dem Schließen des Tags bis zum schließenden a-Tag (area kann's ja nicht sein) muß optional sein, da sonst area-Elemente nicht erfaßt werden.

Dein Ausdruck hat außerdem Probleme mit mehreren Links hintereinander, er ist zu gierig.

<(a(?:rea)?)\s*[^>]*?href=("|')(?!javascript:|mailto:)(\S*)\2\s*([^>]*)>(?:(.+?)</\1>)?
sollte einigermaßen funktionieren.

Ach ja, zum Rumspielen empfehle ich Regex Coach

Und dazu wird eine Backreferenz benutzt. Die ist aber nicht möglich, wenn Du die von Dir vorgeschalgene Variante benutzt.

Natürlich funktioniert es mit meiner Variante. Eine Backreferenz auf das rea wird nicht benötigt (eine auf den kompletten tag-Name schon, aber die bleibt ja unberührt).

cu,
Andreas

--
Warum nennt sich Andreas hier MudGuard?
O o ostern ...
Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.