【发布时间】:2011-10-20 00:01:08
【问题描述】:
我正在尝试搜索数据库中的字段以提取 URL。有时一个字段中会有多个 URL,我想将它们提取到单独的变量(或数组)中。
我知道我的正则表达式不会涵盖所有可能性。只要我标记任何以 http 开头并以空格结尾的内容就可以了。
我遇到的问题是我的努力似乎每条记录仅获得 1 个 URL,或者他们仅获得每个 URL 的最后一个字母 1。我已经根据其他人发布的解决方案尝试了几种不同的技术,但我还没有找到适合我的解决方案。
示例输入行: 测试 http://marko.co http://tester.net 几乎所有你想要的。
输出目标 $var[0] = http://marko.co $var[1] = http://tester.net
第一次尝试: if ( $status =~ m/http:(\S)+/g ) { 打印 "$&\n"; }
输出: http://marko.co
第二次尝试: @statusurls = ($status =~ m/http:(\S)+/g); 打印“@statusurls\n”;
输出: o t
我是正则表达式的新手,但由于每次尝试都使用相同的正则表达式,我不明白为什么它会返回如此不同的结果。
感谢您提供的任何帮助。
我查看了这些帖子,要么没有找到我想要的东西,要么不明白如何实现它:
这似乎是最有前途的(这是我第二次尝试的地方,但它没有返回整个 URL,只返回字母:How can I store regex captures in an array in Perl?
这里面有一些很棒的东西。我很好奇是否需要将 URL 视为一个单词,因为它以空格结尾:Regex Group in Perl: how to capture elements into array from regex group that matches unknown number of/multiple/variable occurrences from a string?
这个提供了与前两个类似的建议。 How can I store captures from a Perl regular expression into separate variables?
解决方案: @statusurls = ($status =~ m/(http:\S+)/g); 打印“@statusurls\n”;
谢谢!
【问题讨论】:
-
另外 - 不要使用
$&- 请参阅 perlre docs 中的警告 -
@urls = $status =~ m{ *(https*://[^ ]+) *}g;