Hallo Dimitri,
ich möchte mit Perl prüfen, ob eine Zeichenkette ein HTML-Elemente mit dem
Attribut title enthält:if (/<(?:.* )?title *= *("?).+\1(?: .*)?>/i)
{
print yeah!;
}
Matcht auf:
<> title=blahr>
<title=><blahr>
....
Hier mein Gedankengang:
<(?:.* )? Es können beliebig viele Zeichen nach der Klammer kommen, dann muss
aber auch das Zeichen vor title ein Leerzeichen sein. title kann auch direkt
nach < kommen, das ist mir egal.
Es duerfen aber nicht beliebige Zeichen nach einem kleiner-als kommen. Ausserdem
matcht (?:.* ) auch auf < title. Also sinnvoller:
<(?:[^>]+ )?
title *= * Es können beliebig viele Leerzeichen zwischen title und = bzw.
zwischen = und dem Wert des Attributes vorkommen, z. B.
<img title = ...>
Sinnvoll.
("?).+\1 Der Wert des Attributes steht oftmals nicht zwischen Anführungsstrichen.
Diese sind also optional ("?).
Was ist mit '?
Der Wert des Attributes ist mindestens ein Zeichen lang.
Aber nicht beliebige Zeichen ;) Wenn das Attribut in " steht, duerfen keine " drin
vorkommen. Steht es in ', so duerfen keine ' drin vorkommen. Ist das Attribut
"freistehend", so darf kein Leerzeichen enthalten sein.
Wurden am Anfang Anführungsstriche gesetzt, so müssen sie auch am Ende
gesetzt worden sein \1.
Korrekt.
So kommen wir also zu:
(?:(?:"[^"]+")|(?:'[^']+')|\S+)
(?: .*)?> Es können weitere Angaben folgen. Wenn dies der Fall ist, dann muss
aber das Zeichen unmittelbar nach dem title-Attribut ein Leerzeichen sein.
Ausserdem duerfen keine > drin vorkommen. Also besser:
(?: [^>]+)?
Daraus folgt:
/<(?:[^>]+ )?title *= *(?:(?:"[^"]+")|(?:'[^']+')|\S+)(?: [^>]+)?/
Ich persoenlich wuerde an deiner Stelle allerdings das ganze nicht ausschliesslich auf
RegExen basierent loesen.
Gruesse,
CK