2 Stimmen

Wie kann ich URLs aus einfachem Text mit Perl extrahieren?

Ich benötige den Perl-Regex, um einfache Texteingaben zu analysieren und alle Links in gültige HTML-HREF-Links umzuwandeln. Ich habe 10 verschiedene Versionen ausprobiert, die ich im Internet gefunden habe, aber keine von ihnen scheint richtig zu funktionieren. Ich habe auch andere auf StackOverflow gepostete Lösungen getestet, von denen keine zu funktionieren scheint. Die korrekte Lösung sollte in der Lage sein, jede URL in der Klartexteingabe zu finden und sie in einen HTML-Link umzuwandeln:

<a href="$1">$1</a>

Einige Fälle, in denen andere reguläre Ausdrücke, die ich ausprobiert habe, nicht korrekt verarbeitet wurden, sind:

  1. URLs am Ende einer Zeile, auf die ein Zeilenumbruch folgt
  2. URLs, die Fragezeichen enthalten
  3. URLs, die mit "https" beginnen

Ich hoffe, dass ein anderer Perl-Kenner da draußen bereits einen regulären Ausdruck hat, den er dafür verwendet und den er mit anderen teilen kann. Vielen Dank im Voraus für Ihre Hilfe!

10voto

brian d foy Punkte 124323

Sie wollen URI::Find . Sobald Sie die Links extrahiert haben, sollten Sie in der Lage sein, den Rest des Problems problemlos zu lösen.

Diese Frage wird beantwortet in perlfaq9 Die Antwort auf "Wie kann ich URLs extrahieren?" Übrigens. Es gibt eine Menge guter Sachen in diesen Perlfaq :)

4voto

gugod Punkte 818

Neben URI::Find auch in der großen Datenbank für reguläre Ausdrücke nachsehen: Regexp::Common gibt es eine Regexp::Common::URI Modul, das Ihnen etwas so Einfaches wie:

my ($uri) = $str =~ /$RE{URI}{-keep}/;

Wenn Sie verschiedene Teile (Hostname, Abfrageparameter usw.) in dieser Uri haben wollen, sehen Sie sich die Dokumentation von Regexp::Common::URI::http für das, was in der $RE{URI} regulärer Ausdruck.

2voto

Sinan Ünür Punkte 114993

Als ich versuchte URI::Find::Schemeless mit dem folgenden Text:

Here is a URL  and one bare URL with 
https: https://www.example.com and another with a query
http://example.org/?test=one&another=2 and another with parentheses
http://example.org/(9.3)

Another one that appears in quotation marks "http://www.example.net/s=1;q=5"
etc. A link to an ftp site: ftp://user@example.org/test/me
How about one without a protocol www.example.com?

es ist durcheinander geraten http://example.org/(9.3) . Also habe ich mir mit Hilfe der folgenden Informationen Folgendes ausgedacht Regexp::Common :

#!/usr/bin/perl

use strict; use warnings;
use CGI 'escapeHTML';
use Regexp::Common qw/URI/;
use URI::Find::Schemeless;

my $heuristic = URI::Find::Schemeless->schemeless_uri_re;

my $pattern = qr{
    $RE{URI}{HTTP}{-scheme=>'https?'} |
    $RE{URI}{FTP} |
    $heuristic
}x;

local $/ = '';

while ( my $par = <DATA> ) {
    chomp $par;
    $par =~ s/</&lt;/g;
    $par =~ s/( $pattern ) / linkify($1) /gex;
    print "<p>$par</p>\n";
}

sub linkify {
    my ($str) = @_;
    $str = "http://$str" unless $str =~ /^[fh]t(?:p|tp)/;
    $str = escapeHTML($str);
    sprintf q|<a href="%s">%s</a>|, ($str) x 2;
}

Bei der gezeigten Eingabe hat dies funktioniert. Natürlich ist das Leben nie so einfach, wie Sie sehen können, wenn Sie versuchen (http://example.org/(9.3)) .

1voto

thillaiselvan Punkte 637

Hier habe ich den Beispielcode gepostet, mit dem die Urls extrahiert werden können. Hier werden die Zeilen von stdin genommen. Und es wird geprüft, ob die Eingabezeile ein gültiges URL-Format enthält. Und es wird Ihnen die URL geben

use strict;
use warnings;

use Regexp::Common qw /URI/;

while (1)
{
        #getting the input from stdin.
        print "Enter the line: \n";
        my $line = <>;
        chomp ($line); #removing the unwanted new line character
        my ($uri)= $line =~ /$RE{URI}{HTTP}{-keep}/       and  print "Contains an HTTP URI.\n";
        print "URL : $uri\n" if ($uri);
}

Ich erhalte die folgende Beispielausgabe

Enter the line:
http://stackoverflow.com/posts/2565350/
Contains an HTTP URI.
URL : http://stackoverflow.com/posts/2565350/
Enter the line:
this is not valid url line
Enter the line:
www.google.com
Enter the line:
http://
Enter the line:
http://www.google.com
Contains an HTTP URI.
URL : http://www.google.com

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X