正則表達式匹配網址
正則表達式:
這有一個 Markdown 的作者之一寫的正則表達式,他把這個表達式都改進了好幾年了,應該比較全面而且保險:
(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))
(查看該作者原文)
PHP示例代碼:
<?php
//注意,這裏把上面的正則表達式中的單引號用反斜槓轉義了,不然沒法放在字符串裏
$regex = '@(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))@';
var_dump( preg_match($regex, 'http://segmentfault.com/q/1010000000584340') ); //true
?>
附:PHP正則表達式匹配:
preg_match_all()函數:用於執行一個全局正則表達式匹配,將實現全部結果的匹配。
preg_match()函數:匹配成功一次後停止匹配。
示例代碼:
<?php
$str = '<b>example: </b><div align=left>this is a test</div>';
preg_match_all("|<[^>]+>(.*)</[^>]+>|U", $str, $matchs);
echo $matchs[0][0] . ", " . $matchs[0][1] . "\n";
echo $matchs[1][0] . ", " . $matchs[1][1] . "\n";
?>
代碼說明:
$matchs數組下標0的結果($matchs[0])是整個表達式的匹配結果,下標1的結果($matchs[1])是第一個小括號裏的表達式 (.*) 的匹配結果,如果還有第二,第三個括號,那麼以此類推。
--------------------------------------------------------------------------------
參考文章出處:
https://segmentfault.com/q/1010000000584340
https://www.hi-docs.com/php/preg_match_all.html