gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:27:02 25 4
gpt4 key购买 nike

这里是文本内部的链接类型。链接可能以空格开头,也可能是较长字符串的一部分,例如: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 = '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';

这是当前输出: 一些文本https://http://www.sdfsd.com一些文本http:// http://www.sdfsd.com http://http://www.sdfsd.com https://
http://www.ertert.com一些文字http://www.ssssss.com http://www.hhhh.com http://www.hhhh.comsdfsdfs

问题是第一个正则表达式还在已经以 http://或 https://开头的正确 URL 中添加了额外的“http://”

"http://www.domain.extension" 
gets converted into this:
"http:// http://www.domain.extension"

最佳答案

使用“negative look behind”限定符确保“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 也是一个好主意。

关于php - 如何编写将纯文本转换为可点击链接的函数,其中文本包含 5 种类型的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com