我正在寻找一种在字符串中查找网址并将其转换为链接的方法。
网址可以是字符串中的任意位置(开头,中间或结尾)。
首选正则表达式,但欢迎使用CPAN模块。
答案 0 :(得分:6)
最常见的解决方案是Regexp::Common(没有双关语)。您需要使用{-keep}
版本,如下所示保持匹配(显然在$1
中)
use Regexp::Common qw /URI/;
while (<>) {
/$RE{URI}{HTTP}{-keep}/ and print "<A HREF="$1">My Link Name</A>";
}
希望很明显,上面的例子每行只找到1个链接。修复更多内容留给用户锻炼。
另一种选择是Schwern的URI::Find。来自POD示例:
use CGI qw(escapeHTML);
use URI::Find;
my $finder = URI::Find->new(sub {
my($uri, $orig_uri) = @_;
return qq|<a href="$uri">$orig_uri</a>|;
});
$finder->find(\$text, \&escapeHTML);
print "<pre>$text</pre>";
答案 1 :(得分:4)
use strict;
use warnings;
use 5.010;
use utf8;
use Regexp::Common qw /URI/;
my $string_with_url = <<'END_STRING';
This is an url to your question:
http://stackoverflow.com/questions/4587876/perl-convert-url-string-to-link
END_STRING
say $string_with_url;
$string_with_url =~ s/($RE{URI}{HTTP})/get_link()/eg;
say $string_with_url;
sub get_link {
return <<'END_LINK';
_____________¶¶¶¶¶¶¶¶¶¶¶¶¶¶
___________¶¶6666555666666¶¶¶
__________¶¶6666555555556666¶¶
___¶¶¶__¶¶¶¶116666556611¶¶666¶¶¶¶
__¶¶cc¶¶§§§¶¶¶11111111¶¶¶¶¶6¶¶cc¶¶
__¶¶cc¶¶¶§§§§¶¶¶¶¶¶¶¶¶¶§§§¶¶¶¶cc¶¶
__¶¶ssc¶¶¶¶§§§§§§§§§§§§§§¶¶¶¶css¶¶
__¶¶ss¶¶§§¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶§§§¶¶ss¶¶
____¶¶ss¶¶ss¯¯¯¯ssss¯¯¯¯ss¶¶ss¶¶
______¶¶ssss__¶¶cccc¶¶__ssss¶¶
______¶¶¶ssscc¶¶cccc¶¶ccss¶¶¶¶
_____¶¶££¶¶sssccccccccss¶¶¶££¶¶
____¶¶££££¶¶ss¶¶cccsss¶¶¶£££¶¶¶¶¶
__¶¶¯¯¶¶¶¶¶¶¶¶¯¯¶¶¶¶¶¶¶££££¶¶¶ss¶¶
__¶¶____________¶¶££££££££¶¶ssss¶¶
__¶¶¯¯$$$$$$$$¯¯¶¶£££££££££¶¶¶cc¶¶
__¶¶__$$ƒƒƒƒ$$__¶¶£££££££¢¢¶¶ccc¶¶
__¶¶¯¯$$ƒƒƒƒ$$¯¯¶¶¢¢¢¥¥¢¢£££¶¶cc¶¶
__¶¶___$$ƒƒ$$___¶¶££££££££¶¶¶¶¶¶¶
____¶¶__$$$$__¶¶££££££¶¶¶¶¥¥¶¶¶
______¶¶____¶¶¶¶¶¶¶¶¶¶¥¥¥¥¥¶¶¶
________¶¶¶¶¶¶¶¶¶¥¥¥¥¥¥¥¶¶¶¶
____________¶¶¶¶¶¶¶¶¶¶¶¶
END_LINK
}
答案 2 :(得分:4)
您可以使用Regexp :: Common查找字符串,然后进行替换以使其成为链接。 在没有任何其他东西的情况下,我使用了URL作为链接文本。
use Regexp::Common "URI";
my $string="Some text containing http://stackoverflow.com/questions/4587876/perl-convert-url-string-to-link in middle" ;
$string =~ s( ($RE{URI}{HTTP}) )
(<a href="$1">$1</a>)gx ;
print $string ;