我从这个PHP字符串开始。
$bodyString = '
another 1 body
reg http://www.regularurl.com/home
secure https://facebook.com/anothergreat.
a subdomain http://info.craig.org/
dynamic; http://www.spring1.com/link.asp?id=100408
www domain; at www.wideweb.com
single no subdomain; simple.com';
需要将所有域名,网址转换为锚点(<a>
)元素。
preg_replace('#[-a-zA-Z0-9@:%_\+.~\#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~\#?&//=]*)?#si', '<a href="$0">$0</a>', $bodyString)
$bodyString
结果:
'another 1 body
reg <ahref="http://www.regularurl.com/home">http://www.regularurl.com/home</a>
secure <a href="https://facebook.com/anothergreat.">https://facebook.com/anothergreat.</a>
a subdomain <a href="http://info.craig.org/">http://info.craig.org/</a>
dynamic; <a href="http://www.spring1.com/link.asp">http://www.spring1.com/link.asp</a>?id=100408
www domain; at <a href="www.wideweb.com">www.wideweb.com</a>
single no subdomain; <a href="simple.com">simple.com</a>';
结果:所有网址,域名都变为<a>
,但 http://www.spring1.com/link.asp?id=100408
正则表达式中缺少什么来使其工作?
答案 0 :(得分:1)
$bodyString = '
another 1 body
reg http://www.regularurl.com/home
secure https://facebook.com/anothergreat.
a subdomain http://info.craig.org/
dynamic; http://www.spring1.com/link.asp?id=100408
www domain; at www.wideweb.com
single no subdomain; simple.com';
$regex = '@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@';
$converted_string = preg_replace($regex, '<a href="$0">$0</a>', $bodyString);
echo $converted_string;
正则表达式解释here
答案 1 :(得分:1)
在@WiktorStribiżew的评论的基础上,你可以试试这个:
[^\s]{2,256}\.[a-z]{2,4}\b(?:[?/][^\s]*)*
<强> Trial over here 强>
注意 - 虽然截至目前已有2个答案,但使用[^\s]
[^\s]{2,256}
匹配2到256个字符,即https://facebook
和https://www.randomdomain
部分,
\.
匹配之后的点,
[a-z]{2,4}
是域名扩展名,例如:com
,in
等
\b
是单词边界,
(?:[?/][^\s]*)*
是一个非捕获组,它匹配斜杠/
或问号?
以及更多网址,所有这些都可以重复零次或多次,表示URL的子页面。
为了更好地理解正则表达式语法,您应该try this website: rexegg.com
答案 2 :(得分:0)