PHP: 从字符串中获取URL的正则表达式

5

可能的重复问题:
如何识别字符串中是否存在URL
Php解析链接/电子邮件

我正在编写一些PHP代码,该代码从各种来源获取输入并需要查找URL并将它们保存在某个地方。 需要处理的输入类型如下:

http://www.youtube.com/watch?v=IY2j_GPIqRA
Try google: http://google.com! (note exclamation mark is not part of the URL)
Is http://somesite.com/ down for anyone else?

输出:

http://www.youtube.com/watch?v=IY2j_GPIqRA
http://google.com
http://somesite.com/

我已经从互联网上借用了一个正则表达式,它可以工作,但不幸的是会清除查询字符串 - 这不好!

如果能提供一个正则表达式或其他解决方案,将不胜感激。

2个回答

12

正则表达式专家Jan Goyvaerts在他的博客中解决了这个问题。但需要注意的是,有很多细节需要处理,比如正确提取括号内的URL。您所需的确切方法取决于输入数据的“质量”。

对于您提供的示例,\b(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]在不区分大小写的模式下使用时可以工作。

因此,要在多行字符串中查找所有匹配项,请使用:

preg_match_all('/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[0];

在我的测试中,这仍然会清除查询字符串。 - jenlampton
@jenlampton:你是什么意思?preg_match_all()根本不会影响$subject字符串。 - Tim Pietzcker

1

为什么不试试这个呢?它是在谷歌搜索“URL正则表达式”后的第一个结果。

((https?|ftp|gopher|telnet|file|notes|ms-help):((\/\/)|(\\\\))+[\w\d:#@%\/;$()~_?\+-=\\\.&]*)

不是 PHP,但应该可以工作,我只是通过转义前斜杠略微修改了它。

source


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接