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

Mat*_*lin 3 php regex url

可能重复:
识别字符串中是否存在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?
Run Code Online (Sandbox Code Playgroud)

输出:

http://www.youtube.com/watch?v=IY2j_GPIqRA
http://google.com
http://somesite.com/
Run Code Online (Sandbox Code Playgroud)

我已经从互联网借用了一个正则表达式,但不幸的是擦掉了查询字符串 - 不好!

任何帮助组合正则表达式,或者可能是这个问题的另一种解决方案,将不胜感激.

Tim*_*ker 11

Regex Guru的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];
Run Code Online (Sandbox Code Playgroud)


Jos*_*ábl 1

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

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

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

来源