PHP - 使用链接替换文本中的URL,但前提是它们尚未标记

问题描述 投票:-1回答:2

我正在寻找一种方法来修改这个函数,我找到了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不是很熟悉,所以如果有一个简单的解决方案就不需要使代码比现在复杂得多,我会很感激。

php regex preg-replace
2个回答
0
投票

我很确定存在一些重复的问题,但我不能立即找到一个(注意:如果有人提供了一个重复链接,我愿意关闭这个问题)。

答案很可能是使用解析器,但对于快速和肮脏的解决方案,你可以使用(*SKIP)(*FAIL),如:

<a[^>]+>.+?</a>(*SKIP)(*FAIL)|\b(?:ftp|https?)://\S+

这需要替换为

<a href="$0">$0</a>

这里的想法是匹配你不想要的东西,例如:任何看起来像链接的东西:

<a[^>]+>.+?</a>

然后“扔掉比赛”并提供另一种选择。见a demo on regex101.com


0
投票
^(?<!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>

如果你想对其他物品做更多的事情,你可以这样做,我尽可能多地捕捉你,以便你可以根据自己的需要进行塑造。

© www.soinside.com 2019 - 2024. All rights reserved.