Wie kann ich Perl regexps verwenden, um alle URLs einer bestimmten Domäne (mit möglicherweise variablen Subdomains) mit einer bestimmten Erweiterung aus reinem Text zu extrahieren? Ich habe versucht:Verwenden von Regex zum Extrahieren von URLs aus reinem Text mit Perl
my $stuff = 'omg http://fail-o-tron.com/bleh omg omg omg omg omg http://homepage.com/woot.gif dfgdfg http://shomepage.com/woot.gif aaa';
while($stuff =~ m/(http\:\/\/.*?homepage.com\/.*?\.gif)/gmsi)
{
print $1."\n";
}
Es schlägt fehl, schrecklich und gibt mir:
http://fail-o-tron.com/bleh omg omg omg omg omg http://homepage.com/woot.gif
http://shomepage.com/woot.gif
Ich dachte, das würde nicht passieren, weil ich .*?
verwende, das sollte nicht gierig sein und geben Sie mir die kleinste Spiel. Kann mir jemand sagen, was ich falsch mache? (Ich möchte nicht etwas uber-Komplex, in Dosen regexp URLs zu überprüfen, ich möchte wissen, was ich tue, falsch, so kann ich daraus lernen.)
[RFC 3986 Anhang C] (http://tools.ietf.org/html/rfc3986#appendix-C) behandelt die speziellen Probleme beim Extrahieren von URIs, einschließlich Fälle, in denen Whitespace zulässig ist. "In einigen Fällen müssen möglicherweise zusätzliche Leerzeichen (Leerzeichen, Zeilenumbrüche, Tabulatoren usw.) hinzugefügt werden, um einen langen URI über mehrere Zeilen hinweg zu trennen. Der Leerraum sollte ignoriert werden, wenn der URI extrahiert wird." Und "aus Gründen der Robustheit sollte Software, die benutzer-typisierte URI akzeptiert, versuchen, sowohl Delimiter als auch eingebettete Leerzeichen zu erkennen und zu entfernen." Aus Erfahrung ist dies jedoch schwierig. – Schwern