2010-04-27 97 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];