使用PHP的preg_match_all提取URL

时间:2013-04-19 21:19:36

标签: php regex url

我一直在努力做下面的工作。基本上,我希望能够从HTML模板中包含的表达式中提取URL,如下所示:

{rssfeed:url(http://www.example.com/feeds/posts/default)}

这个想法是,当找到它时,提取URL,并使用RSS提要解析器获取RSS并将其插入此处。例如,如果我在PHP代码中对URL进行硬编码,这一切都有效,但我只需要弄清楚这个正则表达式,这样模板实际上足够灵活,可以在很多情况下使用。

我已经尝试了至少十种不同的正则表达式,大部分都在SO上找到,但没有一种正在运行。正则表达式甚至不需要验证URL;我只是想找到它并提取它,URL的分隔符也不需要是parens。

谢谢!

2 个答案:

答案 0 :(得分:4)

这对你有用吗?

'@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@'

我用它来匹配文字中的网址。

示例:

$subject = "{rssfeed:url(http://www.example.com/feeds/posts/default)}";
$pattern ='@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@';    
preg_match_all($pattern, $subject, $matches);

print($matches[1][0]);

<强>输出:

http://www.example.com/feeds/posts/default

注意:

还有一篇关于Daring Fireball的文章,名为An Improved Liberal, Accurate Regex Pattern for Matching URLs,对你来说很有意思。

答案 1 :(得分:2)

/\{rssfeed\:url\(([^)]*)\)\}/

preg_match_all('/\{rssfeed\:url\(([^)]*)\)\}/', '{rssfeed:url(http://www.example.com/feeds/posts/default)}', $matches, PREG_PATTERN_ORDER);
print_r($matches[1]);

您应该能够获得$matches[1] ..

中可用内容的所有网址

注意:这只会获得{rssfeed:url()}格式的网址,而不是内容中的所有网址。

你可以在这里试试:http://www.spaweditor.com/scripts/regex/index.php