我需要Perl正则表达式来解析纯文本输入并将所有链接转换为有效的HTML HREF链接。我已经尝试了10个不同的版本,我在网上找到但没有一个看到正常工作。我还测试了StackOverflow上发布的其他解决方案,但这些解决方案似乎都不起作用。正确的解决方案应该能够在纯文本输入中找到任何URL并将其转换为:
<a href="$1">$1</a>
我试过的其他正则表达式的一些情况包括:
我希望那里的另一个Perl家伙已经有了他们正在使用的正则表达式,他们可以共享。在此先感谢您的帮助!
答案 0 :(得分:10)
你想要URI::Find。提取链接后,您应该能够正确处理其余问题。
顺便提一下perlfaq9对"How do I extract URLs?"的回答。 perlfaq中有很多好东西。 :)
答案 1 :(得分:4)
除了URI::Find
之外,还要检查大型正则表达式数据库:Regexp::Common
,有一个Regexp::Common::URI模块可以为您提供以下内容:
my ($uri) = $str =~ /$RE{URI}{-keep}/;
如果您想在该uri中使用不同的部分(主机名,查询参数等),请参阅Regexp::Common::URI::http的文档,了解$RE{URI}
正则表达式中捕获的内容。
答案 2 :(得分:2)
当我使用以下文字尝试URI::Find::Schemeless时:
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?它搞砸了
http://example.org/(9.3)
。所以,我在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/</</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;
}
这适用于显示的输入。当然,通过尝试(http://example.org/(9.3))
可以看到生活从未如此简单。
答案 3 :(得分:1)
在这里,我使用如何提取网址发布了示例代码。 这里将采用stdin的线条。 它将检查输入行是否包含有效的URL格式。 它会为您提供URL
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);
}
我得到的样本输出如下
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