Ein regulärer Ausdruck will mal wieder nicht
Localhorst
- perl
Guten Morgen Forum,
bevor es ins schöne Sommer Wochenende geht hab ich noch eine kleine Frage zu den guten alten regulären Ausdrücken.
Ich möchte aus einem Link der sich in einem String befindet jeweils den Link Text herraus filtern.
(In Beispiel 1 also =>Eukaryota, in Bsp. 2 =>Bacteria)
Es soll aber nur aus den Links die Beschreibung gefiltert werden, bei denen das Alt Attribut ALT="superkingdom" vorkommt.
Das sollte ja nicht so schwer sein, aber es will mir nicht gelingen, ich bekomme durchaus einen Ausdruck hin der mir bei einem der Beispiele den gewünschten Text liefert, aber hab noch keinen hinbekommen der mir etwas bei beiden liefert.
Hier mal mein Ansatz:
$such_string=~m/<A.*ALT="superkingdom".*>([^<]*)</A>/gi;
(Erklärung was ich denke was ich Abfrage mit dem RegExp:
Einen A Tag, gefolgt von beliebigen und beliebig vielen(oder kein) Zeichen dann ein ALT="superkingdom" danach noch mal beliebige Zeichen oder keins bis zum > dann werden alle Zeichen außer das < geklammert und somit gespeichert und dann muß noch mal ein </a> kommen, die ganze Sache ist case insensitive wegen des Flags i)
Beispiel 1: $such_string="...<A HREF="url.de" ALT="superkingdom">Eukaryota</A>..."
oder
Beispiel 2: $such_string="...<a ALT="superkingdom" href="anderer_url.de" TITLE="superkingdom">Bacteria</a>..."
(Die Punkte sollen nur zeigen das die besagte Stelle in einem langen String vorkommen, sind so nicht im String vorhanden ;o) )
Ich hoffe einer von euhc kann mir dabei helfen, dann kann ich mich auch mental vom Computer lösen und werde ein schönes Wochenende genießen.
Gruß
Localhorst
Hi,
Ich möchte aus einem Link der sich in einem String befindet jeweils den Link Text herraus filtern.
(In Beispiel 1 also =>Eukaryota, in Bsp. 2 =>Bacteria)
Schau dir mal das Modul HTML::Parser an, damit müsste es einfacher gehen als mit Regexps.
http://search.cpan.org/dist/HTML-Parser/
HTH
Margin-Auto
Hi,
also ich persönlich finde da regexps schon eleganter, da für eine Aufgabe ein Modul (für mich) overkill ist.
#!/usr/bin/perl
use strict;
use warnings;
my $s='...<A HREF="url.de" ALT="superkingdom">Eukaryota</A>...<a ALT="superkingdom" href="anderer_url.de" TITLE="superkingdom">Bacteria</a>';
foreach ($s=~/<a.*?[^>]>(.*?)<\/a>/gi){
print $_;
}
gruss
#!/usr/bin/perl
use strict;
use warnings;my $s='...<A HREF="url.de" ALT="superkingdom">Eukaryota</A>...<a ALT="superkingdom" href="anderer_url.de" TITLE="superkingdom">Bacteria</a>';
foreach ($s=~/<a.?[^>]>(.?)</a>/gi){
print $_;
}
und was passiert, wenn im alt oder title Attribut ein < vorkommt?
Struppi.
--
[Javascript ist toll](http://javascript.jstruebig.de/)
Hi,
und was passiert, wenn im alt oder title Attribut ein < vorkommt?
Dann ist das HTML noch ungültiger als mit dem alt-Attribut im a-Element ;-)
cu,
Andreas
Hi,
und was passiert, wenn im alt oder title Attribut ein < vorkommt?
seihe https://forum.selfhtml.org/?t=109795&m=687424,
und gar nichts, schlimmer wäre ein >.
gruss
Hi,
Es soll aber nur aus den Links die Beschreibung gefiltert werden, bei denen das Alt Attribut ALT="superkingdom" vorkommt.
Dir ist klar, daß a-Elemente in HTML gar kein alt-Attribut haben?
Das sollte ja nicht so schwer sein, aber es will mir nicht gelingen, ich bekomme durchaus einen Ausdruck hin der mir bei einem der Beispiele den gewünschten Text liefert, aber hab noch keinen hinbekommen der mir etwas bei beiden liefert.
Hier mal mein Ansatz:
$such_string=~m/<A.*ALT="superkingdom".*>([^<]*)</A>/gi;
Das matcht auch
<a>bla</a><img alt="superkingdom" src="bild.png"><a>blablubb</a>
Das erste .* paßt auf '>bla</a><img ', das zweite auf ' src="bild.png"><a'
HTML allein mit Regex zu parsen ist nicht möglich.
(Erklärung was ich denke was ich Abfrage mit dem RegExp:
Einen A Tag, gefolgt von beliebigen und beliebig vielen(oder kein) Zeichen
insbesondere auch weitere Elemente
dann ein ALT="superkingdom" danach noch mal beliebige Zeichen oder keins bis zum >
bis zu einem beliebigen weiteren > - da können zwischendurch noch zig > stehen
dann werden alle Zeichen außer das < geklammert und somit gespeichert und dann muß noch mal ein </a> kommen, die ganze Sache ist case insensitive wegen des Flags i)
cu,
Andreas