Schalter für RegExpr
Uwe Wanzleben
- perl
Hallo,
ich habe mal eine Frage zu RegExpr.
Ich möchte gerne aus einem Quellcode URLs/Links filtern und diese ausgeben.
Dazu habe ich mir folgendes gebastelt:
sub xxx
{
my $inhalt = shift; #Quelltext
$inhalt =~ s/\r/\s/gi;
$inhalt =~ s/\n/\s/gi;
my $ParamValsearch = qq{
'[^"]*" | # a string in double quotes
'[^']*' | # a string in single quotes
[^\s>]* # or anything terminated by ws or >
};
my $ParamValmatch = qq{
"([^"]*)" | # a string in double quotes
'([^']*)' | # a string in single quotes
([^\s>]*) # or anything terminated by ws or >
};
my $HREFsearch =qq{
<a
(?:\s+[-\w]+\s*=\s*(?:$ParamValsearch))*? # any parameters
(?:\s+href\s*=\s*(?:$ParamValmatch)) # href
};
my $IMGsearch =qq{
<img
(?:\s+[-\w]+\s*=\s*(?:$ParamValsearch))*? # any parameters
(?:\s+src\s*=\s*(?:$ParamValmatch)) # img src
};
my $URLsearch = $HREFsearch."|".$IMGsearch;
my(@links) = ($inhalt =~ /$URLsearch/sgix); # Version 1
#my(@links) = ($inhalt =~ /$URLsearch/smgixoc); # Version 2
return @links;
}
Nun, das funktioniert eigentlich Klasse!!!
Aber: Bei einer Datei, die sehr groß ist und teilweise lange Zeilen beinhaltet, kommt etwas zustande wie:
Link: %22/grafik.gif
das %22 ist ein encodiertes '"', wie ich herausfand. Aber ich weiß nicht, warum er das zum URL hinzufügt. Schließlich soll das laut
$ParamValsearch/$ParamValmatch eine Grenze dazu sein.
Noch ein Hinweis:
Version 1 macht in der betreffenden Seite weniger solcher Fehler als Version 2 !!! Bei Version 2 treten zusätzlich abgeschnittene URLs auf.
Mache ich grundsätzlich etwas falsch bzw. welchen Schalter soll ich genau nehmen.
Danke!
Uwe
Hi nochmal,
/mgix funktioniert jetzt!!!
Aber warum?
Uwe
/mgix funktioniert jetzt!!!
leider doch nicht.
Uwe
Hallo,
ich habe mal eine Frage zu RegExpr.
Ich möchte gerne aus einem Quellcode URLs/Links filtern und diese ausgeben.
Du suchst vermutlich das Modul HTML::Parser;
Struppi.
Halihallo Struppi und Uwe
ich habe mal eine Frage zu RegExpr.
Ich möchte gerne aus einem Quellcode URLs/Links filtern und diese ausgeben.
Du suchst vermutlich das Modul HTML::Parser;
oder HTML::LinkExtor; basiert auf HTML::Parser, ist für diese konkrete Aufgabenstellung
vielleicht einfacher zu verwenden.
Viele Grüsse
Philipp
Halihallo Struppi und Uwe
ich habe mal eine Frage zu RegExpr.
Ich möchte gerne aus einem Quellcode URLs/Links filtern und diese ausgeben.
Du suchst vermutlich das Modul HTML::Parser;
oder HTML::LinkExtor; basiert auf HTML::Parser, ist für diese konkrete Aufgabenstellung
vielleicht einfacher zu verwenden.
Danke Euch, sehe ich mir mal an!
Hi,
oder HTML::LinkExtor; basiert auf HTML::Parser, ist für diese konkrete Aufgabenstellung
vielleicht einfacher zu verwenden.
das funktioniert rel. gut. Relativ heißt, sowas:
<a href="b_extranet.html" onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">
kann der NICHT auflösen!
Ich würde hier erwarten:
Link: b_extranet.html
Schade!
Da funktioniert meine Version besser!
Halihallo Uwe
das funktioniert rel. gut. Relativ heißt, sowas:
<a href="b_extranet.html" onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">
kann der NICHT auflösen!
Ich würde hier erwarten:Link: b_extranet.html
dann lass mal folgendes laufen:
<code>
use HTML::LinkExtor;
my $test = '<a href="b_extranet.html" onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">';
$p = HTML::LinkExtor->new(&cb);
sub cb {
my($tag, %links) = @_;
while ( my ($n,$v) = each %links ) {
print 'Link: '.$v."\n";
}
}
$p->parse($test);
</code>
also bei mir funktionierts ;)
oder was soll daran falsch sein?
Viele Grüsse
Philipp
Halihallo Uwe
das funktioniert rel. gut. Relativ heißt, sowas:
<a href="b_extranet.html" onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">
kann der NICHT auflösen!
Ich würde hier erwarten:Link: b_extranet.html
dann lass mal folgendes laufen:
<code>
use HTML::LinkExtor;my $test = '<a href="b_extranet.html" onmouseover="document.image3.src='images/a_extranet.gif'" onmouseout="document.image3.src='images/extranet.gif'">';
$p = HTML::LinkExtor->new(&cb);
sub cb {
my($tag, %links) = @_;
while ( my ($n,$v) = each %links ) {
print 'Link: '.$v."\n";
}
}
$p->parse($test);
</code>also bei mir funktionierts ;)
oder was soll daran falsch sein?
Ich habe es ähnlich gemacht:
sub link_resolve
{
my $inhalt = shift;
#$inhalt =~ s/\r/\s/gi;
#$inhalt =~ s/\n/\s/gi;
my $p = HTML::LinkExtor->new(&callback);
# Set up a callback that collect image links
my @links = ();
sub callback {
my($tag, %attr) = @_;
push(@links, values %attr);
}
$p->parse($inhalt);
return @links;
}
Der Unterschied ist nur, daß ich den gesamten Code in $inhalt habe und die Links als Array @links speicher.
Bei mir löst er das mit LinkExtor nicht auf.
Meine RegExpr. dagegen schaffen es.
Uwe