Как извлечь URL из обычного текста в Perl? - PullRequest
3 голосов
/ 18 октября 2010

Я видел такие сообщения, но не совсем то, что я хочу делать.

Как извлечь и удалить ссылки URL, а затем удалить их из обычного текста.

Пример:

"Hello!!, I love http://www.google.es".

Я хочу извлечь "http://www.google.es",, сохранить его в переменной, а затем удалить его из моего текста.

Наконец, текст должен быть таким:

"Hello!!, I love".

URL-адреса обычно являются последним «словом» текста, но не всегда.

Ответы [ 4 ]

8 голосов
/ 18 октября 2010

Возможно, вы хотите URI :: Find , который может найти URI в произвольном тексте. Возвращаемое значение из указанной вами ссылки на код создает строку замены для URL, поэтому вы можете просто вернуть пустую строку, если вы просто хотите избавиться от URI:

use URI::Find;

my $string = do { local $/; <DATA> };

my $finder = URI::Find->new( sub { '' } );
$finder->find(\$string );

print $string;

__END__
This has a mailto:joe@example.com
Go to http://www.google.com
Pay at https://paypal.com
From ftp://ftp.cpan.org download a file
2 голосов
/ 18 октября 2010
  • Вы можете использовать URI :: Find для извлечения URL-адресов из произвольного текстового документа.
  • или используйте Regexp :: Common :: URI - предоставить шаблоны для URI.

    use strict;
    use warning;
    use Regexp::Common qw/URI/;
    my $str = "Hello!!, I love http://www.google.es";
    my ($uri) = $str =~ /$RE{URI}{-keep}/;
    print "$uri\n"; #output: http://www.google.es
    
0 голосов
/ 01 января 2015

Это работает для меня в 99% случаев, конечно, есть крайние случаи, но для моих нужд это достаточно:

/((?<=[^a-zA-Z0-9])(?:https?\:\/\/|[a-zA-Z0-9]{1,}\.{1}|\b)(?:\w{1,}\.{1}){1,5}(?:com|org|edu|gov|uk|net|ca|de|jp|fr|au|us|ru|ch|it|nl|se|no|es|mil|iq|io|ac|ly|sm){1}(?:\/[a-zA-Z0-9]{1,})*)/mg

https://regex101.com/r/fO6mX3/2

0 голосов
/ 18 октября 2010

Если Perl не обязателен

$ cat  file
"Hello!!, I love http://www.google.es".
this is another link http://www.somewhere.com
this if ftp link ftp://www.anywhere.com the end

$ awk '{gsub(/(http|ftp):\/\/.[^" ]*/,"") }1'  file
"Hello!!, I love ".
this is another link
this if ftp link  the end

Конечно, вы также можете адаптировать регулярное выражение к Perl, если хотите

...