MudGuard: mit RegExp alle Links auslesen, aber nicht die mit rel=nofollow

Beitrag lesen

Hi,

»» (a kann ne ganze Reihe Attribute haben, das rel="nofollow" kann also an vielen Stellen stehen, wird also ziemlich aufwändig).

Warum sollten einen die vielen anderen Attribute, außer href, interessieren?

Der gegebene Ausdruck
<a\s(?!rel="nofollow")
verbietet rel="nofollow" nur als erstes Attribut.
Wenn man nach dieser Methode vorgeht und nicht wie von Dir per
"Zwischen "<a" und dem nächsten ">" aber natürlich nicht alleine. Oder darf "rel=nofollow" noch woanders stehen?"
muß man an jeder möglichen Vorkommens-Stelle verbieten.
Also nach jedem möglichen Attribut.
Oder eben so wie von Dir vorgeschlagen insgesamt innerhalb von <a und dem nächstmöglichen > (wobei es genaugenommen das nächstmögliche > außerhalb eines Attributwerts sein muß - < ist zwar innerhalb von Attributwerten nicht erlaubt, > dagegen schon, z.B. title="-->" ...).

Der von Beat vorgeschlagene Ausdruck matcht zwar richtigerweise nicht auf
<a ref="nofollow" href="bla"
ber er matcht fälschlicherweise auf
<a href="bla" ref="nofollow"
oder
<a id="blubb" ref="nofollow" href="bla"
oder
<a style="color:red" ref="nofollow" href="bla"
oder
<a style="color:red" href="bla" ref="nofollow"

Wenn man also nicht insgesamt \sref=["']nofollow["']\s? *) innerhalb von <a > verbietet (wie von Dir vorgeschlagen), sondern dies explizit an bestimmten Stellen tun will (wie von Beat vorgeschlagen), dann muß man eben alle möglichen Stellen angeben.
Oder zwischen <a und dem ref=["']nofollow["'] muß eine beliebige Anzahl von Attributen samt ggf. Wert zugelassen werden. Also sowas wie
(?:\s+(?:id|style|class|href(?:lang)?|name|lang)*(?:=(?:"[^"]*"|'[^']*'))?)*
wobei die Liste der zulässigen Attributnamen hier nur angedeutet ist und sicher nicht vollständig ist. Und bei den Attributwerten muß für den Fall HTML (statt XHTML) auch noch die Variante ohne Anführungszeichen berücksichtigt werden.
Und im Falle von HTML auch noch die Shorttags-Variante <a href=bla/blubb/

Insgesamt gesehen war mein Einwand an dieser Stelle nur ein weiterer auf dem Weg, klarzumachen, daß das mit regulären Ausdrücken nicht wirklich einfach ist. Die anderen (von Beat vorgeschlagenen) Ausdrücke hab ich ja schon an anderen Stellen des Threads als unzutreffend dargestellt.

Das wirklich sauber und vollständig als Regex zu implementieren, ist ziemlich aufwändig - da dürfte es wirklich einfacher sein, einen (fertigen) Parser für die jeweilige Dokumentsprache zu benutzen. Die sind in langer Arbeit entstanden und enthalten mit Glück auch schon alle Sonderfälle.

Ich behaupte mal, daß ich nicht gerade ein Anfänger bin bzgl. Regex, aber einen Regex zu schreiben, der wirklich alle laut (X)HTML-Standard zulässigen Sonderfälle berücksichtigt, würde mich sicher einige Tage kosten.
Wenn man dann noch die Fälle dazunimmt, die zwar nicht standardkonform sind, aber in gängigen Browsern dennoch funktionieren, wird's ein Riesenaufwand.

*) was auch schon wieder eine Ungenauigkeit enthält, denn das zweite ["'] müßte eigentlich eine Backreferenz auf das erste ["'] sein, denn nur matchende "" bzw. '' grenzen einen Attributwert ein, weder attr="val' noch attr='val" ist korrekt - oder es muß, wie oben angedeutet, als Alternative geschrieben werden.

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.