字符串中所有网址的正则表达式不捕获带问号的网址

时间:2018-04-03 13:32:42

标签: php regex url

我从这个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

正则表达式中缺少什么来使其工作?

3 个答案:

答案 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;

Demo

正则表达式解释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://facebookhttps://www.randomdomain部分,
\.匹配之后的点,
[a-z]{2,4}是域名扩展名,例如:comin\b是单词边界,
(?:[?/][^\s]*)*是一个非捕获组,它匹配斜杠/或问号?以及更多网址,所有这些都可以重复零次或多次,表示URL的子页面。

为了更好地理解正则表达式语法,您应该try this website: rexegg.com

答案 2 :(得分:0)

[-\w@:%+.\~#?&/=]{2,256}\.[a-z]{2,4}\b[^\s]*

[^\s]*会将任何非空格字符添加到网址中。当有空格时,它不是URL的一部分。简单易行。

工作网址here