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

3

我看到一些类似的帖子,但不完全是我想要做的。

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

示例:

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

我希望提取"http://www.google.es",将其保存在一个变量中,然后从我的文本中删除它。
最后,文本应该是这样的:
"Hello!!, I love".

通常情况下,URL是文本的最后一个“单词”,但并非总是如此。
4个回答

8
也许你需要使用URI::Find来查找任意文本中的URL。你可以给它一个代码引用作为参数,然后返回值就是URL的替换字符串。如果你只想删除URL,那么可以返回空字符串:
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
  • You can use URI::Find to extract URLs from an arbitrary text document.
  • or use Regexp::Common::URI- provide patterns for URIs.

    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
    

遗憾的是 Regexp::Common 没有支持所有应该支持的内容。 - brian d foy
@brian d foy: 好的,我明白了,但我也建议使用 URI::Find :) - Nikhil Jain

1
这对我来说在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


-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


1
使用手写的正则表达式来查找URI将充满错误。实际符合标准的模式比您展示的要复杂得多。 - Ether
1
@Ether,那是胡说八道,OP的要求很简单。正则表达式方法肯定没问题。我不需要下载任何模块。 - ghostdog74
什么要求?他没有说只限制为两个URI方案。你的正则表达式无法处理很多情况。正则表达式可能没问题,但你的正则表达式不行。 - brian d foy
兄弟,看看他的帖子。他大部分的URL都在文本末尾。我只是根据他在问题中提供的信息来回答。我可以推断出他的要求可能很复杂,也可能很简单。我选择了后者。如果你认为我的正则表达式不够通用,我并不在意。我会让原帖作者自己决定,而不是你。 - ghostdog74
2
@ghost:很可能,楼主不知道什么是足够的;他希望我们能给他好的建议。 :) - Ether
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接