以下是文本内部的链接类型。链接可以以空格开头,也可以是较长字符串的一部分,例如: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"
答案 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);