2010-04-27 93 views
3

可能重复:
Identifying if a URL is present in a string
Php parse links/emailsPHP:正则表达式从字符串获取URL

我工作的一些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/ 

我已经从工作,但不幸的是互联网借一个正则表达式抹查询串出- 不好!

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

回答

1

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

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

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

source

11

月Goyvaerts,正则表达式大师,has addressed this issue in his blog。有相当多的警告,例如正确提取括号内的网址。你需要什么取决于你的输入数据的“质量”。

对于您提供的示例,\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];