使用正则表达式从Perl中提取纯文本的URL

tes*_*234 6 regex url perl

如何使用Perl regexp从纯文本中提取具有特定扩展名的特定域(可能具有可变子域)的所有URL?我试过了:

my $stuff = 'omg http://fail-o-tron.com/bleh omg omg omg omg omg http://homepage.com/woot.gif dfgdfg http://shomepage.com/woot.gif aaa';
while($stuff =~ m/(http\:\/\/.*?homepage.com\/.*?\.gif)/gmsi)
{
print $1."\n";
}
Run Code Online (Sandbox Code Playgroud)

它失败了,给了我:

http://fail-o-tron.com/bleh omg omg omg omg omg http://homepage.com/woot.gif
http://shomepage.com/woot.gif
Run Code Online (Sandbox Code Playgroud)

我认为这不会发生因为我正在使用.*?,这应该是非贪婪的,并给我最小的匹配.谁能告诉我我做错了什么?(我不想要一些超级复杂的,预制的regexp来验证URL;我想知道我做错了什么,所以我可以从中学习.)

Sch*_*ern 16

URI :: Find专门用于解决此问题.它将找到所有URI,然后您可以过滤它们.它有一些启发式来处理拖尾标点符号等事情.

更新:最近更新以处理Unicode.


Tel*_*hus 5

访问CPAN:Regexp :: Common :: URI

编辑:即使您不需要预制正则表达式,它也可以帮助您查看有效的测试模块的来源.

如果要查找与特定字符串匹配的URL,可以轻松使用此模块执行此操作.

#!/usr/bin/env perl
use strict;
use warnings;
use Regexp::Common qw/URI/;

while (<>) {
  if (m/$RE{URI}{HTTP}{-keep}/) {
    print $_ if $1 =~ m/what-you-want/;
  }
}
Run Code Online (Sandbox Code Playgroud)