我正在寻找一种方法来修改这个函数,我找到了here,这样它就不会改变我已有的标签。
function make_links_clickable($text){
return preg_replace('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="$1">$1</a>', $text);}
例如,虽然它可以很好地将常规文本转换为链接,但它也会变成这样:
<a href="https://stackoverflow.com/">stackoverflow</a>
进入:
https://stackoverflow.com/">stackoverflow
因为我是初学者,并且对regexp不是很熟悉,所以如果有一个简单的解决方案就不需要使代码比现在复杂得多,我会很感激。
我很确定存在一些重复的问题,但我不能立即找到一个(注意:如果有人提供了一个重复链接,我愿意关闭这个问题)。
答案很可能是使用解析器,但对于快速和肮脏的解决方案,你可以使用(*SKIP)(*FAIL)
,如:
<a[^>]+>.+?</a>(*SKIP)(*FAIL)|\b(?:ftp|https?)://\S+
这需要替换为
<a href="$0">$0</a>
这里的想法是匹配你不想要的东西,例如:任何看起来像链接的东西:
<a[^>]+>.+?</a>
然后“扔掉比赛”并提供另一种选择。见a demo on regex101.com。
^(?<!href=["'])(?P<link>https?:\/\/(?:(?P<subdomain>(?:.*?\.)*?)(?P<domain>[^.]*))(?P<tld>\.[^.\n]+|\.co\.[^\/]+)(?P<path>(?:\/.*?|)))$
使用这个正则表达式和替换,你应该能够做到这一点。
在Regex101上查看
在替换中,我做到了这一点:
<a href="${link}">${domain}</a>
这转变为:
https://stackoverflow.com
http://www.bbc.co.uk/news
进入这些:
<a href="https://stackoverflow.com">stackoverflow</a>
<a href="http://www.bbc.co.uk/news">bbc</a>
但是不要碰这个:
<a href="https://stackoverflow.com">stackoverflow</a>
如果你想对其他物品做更多的事情,你可以这样做,我尽可能多地捕捉你,以便你可以根据自己的需要进行塑造。