如何编写一个函数将纯文本转换为可点击的链接,其中文本包含5种类型的URL

时间:2015-12-28 06:47:50

标签: php regex

以下是文本内部的链接类型。链接可以以空格开头,也可以是较长字符串的一部分,例如:sometexthttp://www.domain.extension?parameters

1. http://domain.extension?parameter  
2. http://subdomain.domain.extension?parameters
3. https://domain.extension?parameter
4. https://subdomain.domain.extension?parameters
5. www.domain.extension?parameter  

我编写了以下功能部分工作。第一个正则表达式找到包含" www。"的所有字符串。并添加前缀" http://"。第二个正则表达式将它们包含在" a"标签

function MakeClickableLinks($text) {                         
$text = preg_replace('(((www).([-\w\.]+)+(:\d+)?(/([\w/_\.%-=#]*(\?\S+)?)?)?))',   ' http://$1',   $text);                          
$text = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.%-=#]*(\?\S+)?)?)?)@',     '<a href="$1" rel="nofollow" target="_blank">$1</a>',       $text);       

return $text;               
}

这是测试字符串:     $ text =&#39; some-texthttps://www.sdfsd.com some-texthttp://www.sdfsd.com http://www.sdfsd.com https://www.ertert.com sometextwww.ssssss.com www.hhhh.com www .hhhh.comsdfsdfs&#39 ;;

这是当前输出:     some-texthttps:// http://www.sdfsd.com some-texthttp://     http://www.sdfsd.com http:// http://www.sdfsd.com https://
    http://www.ertert.com sometext http://www.ssssss.com http://www.hhhh.com     http://www.hhhh.comsdfsdfs

问题在于,第一个正则表达式还增加了额外的&#34; http://&#34;在已经以http://或https://

开头的正确网址中
"http://www.domain.extension" 
gets converted into this:
"http:// http://www.domain.extension"

2 个答案:

答案 0 :(得分:1)

使用“负面后视”限定符来确保“www”前面没有正斜杠“/”通过排除所有http://和https://来避免不需要的插入来解决问题:)。

以下是原始问题中修改后的第一个正则表达式。

((?<![/])((www).([-\w\.]+)+(:\d+)?(/([\w/_\.%-=#]*(\?\S+)?)?)?))


这是完整的工作功能,使用带有负面外观的第一个正则表达式以及Simo建议的第二个正则表达式。

function MakeClickableLinks($text) {       
$text = preg_replace('@((?<![/])((www\.).([-\w\.]+)+(:\d+)?(/([\w/_\.%-=#]*(\?\S+)?)?)?))@',  ' http://$1',  $text);              
$text = preg_replace("/((https?:\/\/)[^\s]+)/",   '<a href="$1" rel="nofollow" target="_blank" >$1</a>',  $text);         
return $text;               
}

这已经过php7测试,可以捕获纯文本中的大多数URL。其他改进可能包括限制URL长度。

同样最好通过一些XSS清理库运行生成的HTML,以从URL中删除任何潜在的XSS。

答案 1 :(得分:0)

如果只是获取以www。,http://或https://开头的所有内容,直到第一个空格? <击> 正则表达式搜索

(?<link>(www\.|https?://)[^\s]+)

正则表达式替换

<a href='${link}'>${link}</a>

<击> 这不完美,但可能会有所帮助。此外,我并非100%确定上面的正则表达式语法是正确的。

编辑:无法使用www.phpliveregex.com使命名组合作。这是没有它们的解决方案:

preg_replace("/((www\.|https?:\/\/)[^\s]+)/", "<a href='$1'>$1</a>", $input_lines);