Regexp mit Links. Brauche mal Eure Hilfe!
Nachtwesen
- php
Hallo zusammen und guten Abend!
Ich lese mich nun seit Stunden in Regexp ein und ich muss sagen: Das ist mir zu hoch, ich steige durch diese "Logik" einfach noch nicht durch. Deshalb bin ich so dreist hier zu fragen ob mir wohl jemand kurz helfen könnte!? Danke schonmal.
Es geht sich um die Links in einer HTML Datei welche ich in PHP einlese. Diese Links haben das Format:
<A HREF="http://www.avatomatic.de/" ADD_DATE="851377089" LAST_VISIT="1172694273" LAST_MODIFIED="851377011" ICON="data:" LAST_CHARSET="ISO-8859-1" ID="rdf:#$pTP7.">Avat-O-Matic</A>
Ich benötige nun nur den Link ansich und den Titel, also
[1] http://www.avatomatic.de/
[2] Avat-O-Matic
Wäre jemand sooooo lieb mir das als preg_match_all() umzusetzen?! Es muss preg_match_all sein, da es sich in der HTML Datei um sehr viele solcher Links handelt. DANKE!!!
Hallo Nachtwesen.
Ich lese mich nun seit Stunden in Regexp ein und ich muss sagen: Das ist mir zu hoch, ich steige durch diese "Logik" einfach noch nicht durch.
Woran hapert es denn? Hast du das vorzügliche Tut beim RegExp-Evaluator studiert?
Es geht sich um …
Paul, bist du es?
… die Links in einer HTML Datei welche ich in PHP einlese. Diese Links haben das Format:
<A HREF="http://www.avatomatic.de/" ADD_DATE="851377089" LAST_VISIT="1172694273" LAST_MODIFIED="851377011" ICON="data:" LAST_CHARSET="ISO-8859-1" ID="rdf:#$pTP7.">Avat-O-Matic</A>
Ich benötige nun nur den Link ansich und den Titel, also
[1] http://www.avatomatic.de/
[2] Avat-O-Matic
Ein mögliches Pattern zum Extrahieren könnte so aussehen:
!<A.*HREF="([^"]+)"[^>]*>([^<]+)</A>!is
Zur Erläuterung:
! - Aus dem Pool der erlaubten Delimiter gewählt
<A - Die wortwörtliche Zeichenkette „<A“
.* - Irgendetwas, beliebig oft
HREF=" - Die Zeichenkette „HREF="“
( - Öffnende erste Kapselung für das Linkziel
[^"]+ - Irgendetwas außer „"“, mindestens einmal aber auch beliebig oft
) - Schließende erst Kapselung
" - Das Zeichen „"“
[^>]* - Irgendetwas außer „>“, beliebig oft
- Das Zeichen „>“
( - Öffnende zweite Kapselung für den Linktext
[^<]+ - Irgendetwas außer „<“, mindetens einmal aber auch beliebig oft
) - Schleißende zweite Kapselung
</A> - Die Zeichenkette „</A>“
i - Case Insensitive, Groß- Kleinschreibung also ignorieren
s - Auch Zeilenumbrüche erlauben
Einen schönen Freitag noch.
Gruß, Mathias
Hallo Mathias,
!<A.*HREF="([^"]+)"[^>]*>([^<]+)</A>!is
Das funktioniert nicht ganz so wie erwartet. Denn Dein .* ist greedy und matcht damit zu viel, genau dann nämlich, wenn zwei derartige Tags im Inhalt auftreten. Zwei Möglichkeiten, den Ausdruck abzuwandeln:
!<A[^>]+HREF="([^"]+)"[^>]*>([^<]+)</A>!is
Das wäre mein Favorit.
Alternativ kannst Du auch folgendes machen:
!<A.*HREF="([^"]+)"[^>]*>([^<]+)</A>!isU
Das matcht aber im Gegensatz zur ersten Konstruktion auch auf Konstruktionen wie <A NAME="xyz">blaHREF="foo">Hallo</a>.
Ferner: Alle diese Ausdrücke funktionieren nur solange in den Attributwerten keine > vorkommen, wenn da doch > vorkommen, muss man sich einen komplizierteren Ausdruck ausdenken.
Viele Grüße,
Christian
Hallo zusammen!
Besten Dank für die super Hilfe. Ich habe mich für folgende Kombination entschieden:
!<A[^>]+HREF="([^"]+)"[^>]*>([^<]+)</A>!is
Diese funktioniert genau wie ich es wünsche. Nochmals: Vielen Dank!
Wenn ich nun die Datei mit den Links jedoch aus Sicherheitsgründen per htmlentities() bearbeite, funktioniert das logischerweise nicht mehr so nett. Wenn jemand noch einmal Zeit hat und mir das in den oben genannten Link noch einbauen könnte, das es auch nach htmlentities noch funktioniert wäre ich sehr dankbar!
Euch ein super Wochenende...