Dimitri Rettig: Problem mit regulären Ausdrücken

Beitrag lesen

Hallo,

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!;
}

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.

title *= *   Es können beliebig viele Leerzeichen zwischen title und = bzw. zwischen = und dem Wert des Attributes vorkommen, z. B.
<img title    = ...>

("?).+\1   Der Wert des Attributes steht oftmals nicht zwischen Anführungsstrichen. Diese sind also optional ("?). Der Wert des Attributes ist mindestens ein Zeichen lang. Wurden am Anfang Anführungsstriche gesetzt, so müssen sie auch am Ende gesetzt worden sein \1.

(?: .*)?>   Es können weitere Angaben folgen. Wenn dies der Fall ist, dann muss aber das Zeichen unmittelbar nach dem title-Attribut ein Leerzeichen sein.

Das Problem ist, dass auch dieser String passt:
<img title="irgendeintitel> Ich denke, dies liegt daran, dass title *= * die Gänsefüßchen " ebenfalls einschließt. Dann findet ("?) keine Anführungsstriche und dementsprechend ist \1 ebenfalls "" (leer). Wie soll ich nun mein Programm abändern, dass es hinhaut?

Mit freundlichen Grüßen
   Dimitri Rettig