Thread Links filtern: reguläre ausdrücke (18 answers)
Opened by Gast at 2003-09-07 16:34

Dubu
 2003-09-07 17:09
#85075 #85075
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Zerlegen wir die Regex doch mal:
Code: (dl )
1
2
3
4
5
6
7
8
9
<           # Eine spitze Klammer auf
a+          # Eine Folge von einem oder mehr 'a's
[\s]+       # Eine Folge von einem oder mehr Zeichen aus der Menge [\s], d.h. Whitespace
href+       # Die Buchstabenfolge 'hre', gefolgt von einem oder mehr 'f's
=+          # Eine Folge von einem oder mehr Gleichheitszeichen
([\w])+     # Eine Folge von einem oder mehr Zeichen aus der Menge [\w], also Wortzeichen
            # Das sind A-Z, a-z und '_'.
            # Jedes einzelne Zeichen wird in einem der Speicher $1, $2, etc. gemerkt
>           # Eine spitze Klammer zu

Du bist dir ueber die Bedeutung des '+' in regulaeren Ausdruecken wahrscheinlich nicht ganz im Klaren. Hast du perlrequick gelesen?

Da HTML deutlich komplizierter ist, als deine Regex oben, solltest du fuer diese Aufgabe einen HTML-Parser nehmen, in diesem Fall am einfachsten CPAN:HTML::LinkExtor.
Ausnahme: Du kennst genau den Aufbau der <a href>-Tags und kannst deshalb mit einer eingeschraenkten Regex leben.

Ein Beispiel:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ($date =~ /
    <a          # spitze Klammer auf und 'a'
    \s+         # Eine Folge von einem oder mehr Whitespacezeichen
    href        # Der Text 'href'
    \s*         # Eine Folge von keinem oder mehr Whitespacezeichen
    =           # Ein Gleichheitszeichen
    \s*         # Eine Folge von keinem oder mehr Whitespacezeichen
    "           # Ein Anfuehrungszeichen
    ([^"]+)     # Eine Folge von einem oder mehr Zeichen, die kein Anfuehrungszeichen sind.
                # Die Folge wird sich in $1 gemerkt.
    "           # Ein Anfuehrungszeichen
    \s*         # Eine Folge von keinem oder mehr Whitespacezeichen
    >           # Eine spitze Klammer zu
    /xi                # Ende der Regex; Kommentare erlauben und ignore-case einschalten
    )
[...]

Diese Regex erkennt schon einige <a href>-Tags, aber
- das href muss der erste Parameter sein (kein <a style=... href=...>! )
- die URI muss in Anfuehrungszeichen stehen (was der HTML-Spec entspricht)
- die Anfuehrungszeichen muessen doppelt sein (was nicht der HTML-Spec entspricht)
- nach der URI duerfen keine weiteren Parameter stehen (kein <a href=... style=...>! )

Du siehst, da sind ziemlich viele Einschraenkungen, wenn man es mit einer simplen Regex parsen will. Nimm lieber das Modul.

View full thread Links filtern: reguläre ausdrücke