正则表达式匹配网址
正则表达式:
这有一个 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