Mit regex zu extrahieren, URLs in reinen text mit Perl
Wie kann ich mit Perl regexps die Extraktion aller URLs einer bestimmten Domäne (mit evtl. variabler subdomains) mit einer bestimmten Erweiterung aus plain text? Ich habe versucht:
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";
}
Scheitert es 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, dass würde nicht passieren, denn ich bin mit .*?
, sollte nicht gierig sein und geben mir die größte übereinstimmung. Kann mir jemand sagen was ich falsch mache? (Ich will nicht einige uber-Komplex, Konserven regexp validieren URLs; ich will wissen, was ich falsch mache, damit ich daraus lernen kann.)
InformationsquelleAutor test1234 | 2009-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
URI::Find ist speziell entwickelt, um dieses problem zu lösen. Es findet alle URIs und dann kannst du filtern. Es hat ein paar Heuristiken, um Dinge zu handhaben wie die nachfolgende Satzzeichen.
UPDATE: vor Kurzem aktualisiert, um den Umgang mit Unicode.
InformationsquelleAutor Schwern
Besuchen CPAN: Regexp::Common::URI
Bearbeiten: Auch wenn Sie nicht wollen, eine vorgefertigte reguläre Ausdrücke können Ihnen helfen, schauen Sie in die Quelle ein Modul getestet, das funktioniert.
Wenn Sie möchten, zu finden, die URLs übereinstimmen, die eine bestimmte Zeichenfolge ist, können Sie einfach mit diesem Modul zu tun.
InformationsquelleAutor Telemachus
Benutzt habe ich folgenden code zu extrahieren, die links, die enden mit bestimmten Erweiterung
wie *.htm, *.html, *.gif -, *.jpeg.
Hinweis: In diesem Skript die Endung *.html wird zuerst geschrieben und dann *.htm weil beide "htm" gemeinsam. Also diese Art von änderungen sollten sorgfältig durchgeführt werden.
Eingang: Dateinamen mit links und Namen für die Ausgabedatei an, in denen Ergebnisse gespeichert werden.
Ausgabe: Wird gespeichert in der Ausgabe-Datei.
Code geht hier:
Ausgabe des Strings ist hier:
(html?|gif|jpe?g)
statt(html|htm|gif|jpeg|jpg)
?ja, das ist besser 🙂
Perfekt, perfekt!
Id würde werfen in
(https?|ftp)
als ändern sich auch, aber sonst funktioniert esja, das ist besser.
InformationsquelleAutor Pushpendra
URLs sind nicht erlaubt, keine Leerzeichen enthalten, also anstelle von .*? Sie sollten \S*?, für null-oder-mehr nicht-Leerzeichen.
InformationsquelleAutor DougWebb
Diese regex für mich gearbeitet
InformationsquelleAutor user6320052
Tut es, aber es gibt Sie, die kleinste match gehen Recht. Ausgehend von der ersten
http
und rechts gehen, das ist die kleinste übereinstimmen.Bitte beachten Sie für die Zukunft, die Sie nicht haben, um zu entkommen die Schrägstriche, weil Sie nicht haben, zu verwenden Schrägstriche als Trennzeichen. Und Sie nicht haben, um die Flucht der Doppelpunkt. Das nächste mal einfach so machen:
oder
oder
oder einer der vielen anderen Charaktere, finden Sie in der perlre-Dokumentation.
InformationsquelleAutor AmbroseChapel
Hier ist ein regex (hoffentlich) erhalten|extrahieren|erhalten alle URLs aus string|text-Datei, das scheint zu funktionieren für mich:
... oder in einem Beispiel:
Für meine noob-Referenz, hier ist die debug-version des gleichen Befehls oben:
Die regex passt auf
http(s)://
- und Leerzeichen verwendet,"
und)
als "exit" - Zeichen; dann verwendet positive lookahead - zu, zunächst, die Ursache für ein "exit" auf "http
" wörtliche Gruppe (wenn ein Spiel bereits im Gange ist); jedoch, da das auch "frisst" das Letzte Zeichen der vorherigen match, hier die lookahead-match verschoben wird, ist ein Zeichen freuen "ttp:
".Einige nützliche Seiten:
$&
,@-
... )Hoffe, dies hilft jemand,
Prost!
EDIT: Ups, gerade gefunden über URI::Find::Simple - search.cpan.org, scheint das gleiche zu tun (über regex - Erste website-Titel über einen link in einem string)
InformationsquelleAutor sdaau