PHP:修改链接转换函数,避免改写已存在的链接标签
解决make_links_clickable函数误改已有链接的问题
我懂你的痛点——这个正则确实会“误伤”已经用<a>标签包裹好的链接,把原本正常的链接拆得乱七八糟。其实不用大动干戈改代码,给正则加个简单的断言就能解决问题。
原函数的问题在于,它会匹配所有符合格式的URL,不管这个URL是不是已经在<a>标签的href属性里。我们只需要给正则加一个负向后顾断言,让它只匹配那些不在<a href="之后的URL就行。
修改后的函数代码如下:
function make_links_clickable($text){ return preg_replace('!(?<!<a href=")(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="$1">$1</a>', $text); }
改动说明:
- 我在正则最开头加了
(?<!<a href="),这是一个负向后顾断言,意思是:当前匹配的URL前面不能是<a href="这个字符串。 - 这样一来,已经在
<a>标签href里的URL就会被排除在外,不会被重复转换,而普通文本里的URL依然会正常变成可点击链接。
举个测试例子:
输入文本:
这是一个普通链接:https://example.com,这是一个已有链接:stackoverflow
处理后输出:
这是一个普通链接:https://example.com,这是一个已有链接:stackoverflow
完美保留了原有链接,同时转换了纯文本URL,而且代码几乎没怎么改,完全符合你要的简单解决方案~
内容的提问来源于stack exchange,提问作者iai44
相关产品推荐
相关产品推荐

