我想匹配墙贴中的url链接并用锚标记替换此链接,为此我使用下面的正则表达式.
我想匹配4种类型的网址:
http://example.comhttps://example.comwww.example.comexample.compreg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@',
'<a href="$1">$1</a>', $subject);
Run Code Online (Sandbox Code Playgroud)
此表达式仅匹配前两种类型的URL.
如果我将此表达式用于匹配url模式
'@(www?([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@',那么它只匹配第三种类型的url模式.
如何将所有四种类型的url模式与单个正则表达式匹配?
Nev*_*kes 15
说实话,我会使用不同的正则表达式.就像格鲁伯在2009年发布的那样:
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
Run Code Online (Sandbox Code Playgroud)
或者这个Gruber 在2010年发布的更新版本(谢谢,@ IMSoP):
(?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`!()\[\]{};:'".,<>?«»“”‘’]))
Run Code Online (Sandbox Code Playgroud)
Mār*_*dis 15
使用Nev Stokes给出链接的完整工作示例:
public function clickableUrls($html){
return $result = preg_replace(
'%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s',
'<a href="$1">$1</a>',
$html
);
}
Run Code Online (Sandbox Code Playgroud)