如何从Perl中的纯文本中提取URL?

时间:2010-10-18 10:16:20

标签: perl url text extract

我见过这样的帖子,但不完全是我想做的事。

如何提取和删除URL链接,然后从纯文本中删除它们。

示例:

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

我想提取“http://www.google.es”,将其保存在变量上,然后将其从我的文本中删除。

最后,文本必须是这样的:

"Hello!!, I love".

网址通常是文字的最后一个“字”,但并非总是如此。

4 个答案:

答案 0 :(得分:8)

也许你想要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

答案 1 :(得分:2)

  • 您可以使用URI::Find从任意文本文档中提取网址。
  • 或使用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
    

答案 2 :(得分:0)

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

答案 3 :(得分:-4)

如果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