【问题标题】:Url regex for preg_replace but without matching the urls within the bbcode [url]preg_replace 的 URL 正则表达式,但不匹配 bbcode [url] 中的 url
【发布时间】:2012-04-26 14:26:39
【问题描述】:

我正在网站上创建评论部分。 起初我需要做一个正则表达式来查找任何 url 并将其替换为

<a href="url"></a>  

所以我找到了一个超级正则表达式来查找评论中的所有 url,并且我做了一个返回所有带有 html 标签的 url 的函数:

function addURLTags($string) {
    $pattern = "/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/";
    return preg_replace($pattern, '<a href="$1">$1</a>', $string);
}

一切都很顺利。但是一周前我的老板告诉我,现在我必须将 bbcode 添加到评论部分。我说“没问题”……但后来他告诉我,我的函数 addURLTags 必须保留。

所以任何这样的字符串:

http://www.google.com
[url]http://www.google.com[/url]
[url="http://www.google.com"]http://www.google.com[/url]

必须替换成相同的字符串:

<a href="http://www.google.com">http://www.google.com</a>

所以我得到了一个小的 php 库,它将所有 bbcode 出现替换为 html 代码。

我想:“好吧,首先我应该得到所有在开始时没有 [url] 标签的 url 出现!然后我替换所有 bbcode 标签”

我试图在超级正则表达式的开头添加一个否定断言,如下所示:

/(?i)\b((?![url])(?:https?://|www\d{0,3}[.]|[a-z0-9.-]+[ .][az]{2,4}/)(?:[^\s()]+|(([^\s()]+|(([^\s()] +)))))+(?:(([^\s()]+|(([^\s()]+)))))|[^\ s`!()[]{};:'\".,?«»“”'']))/

但没用!

我是正则表达式的新手,我尝试过的所有在线测试人员都不能很好地使用这么长的正则表达式。我不知道还有什么尝试。

你有什么建议吗?你知道任何 PHP 库可以使用和不使用 [url] bbcode 标签进行“url 替换”吗?

提前谢谢你。

【问题讨论】:

    标签: php regex bbcode


    【解决方案1】:

    你在这里解决了两个问题。因此,请分别解决它们,不要将所有内容都放入一个正则表达式中,这或多或少会使事情变得更复杂而不是更复杂。

    分而治之:

    首先使用您的 bbcode 库找到这些 url 所在的部分,以便您可以创建文本流:

    "normal text", "bbcode", "normal text", "bbcode"
    

    然后您应用 bbcode 库仅在“bbcode”段上创建 URL,并且您的 URL clickable-maker 将仅应用于“普通文本”段。

    处理完所有段后,将所有段连接回一个字符串。

    瞧,问题解决了。

    【讨论】:

    • 我太专注于按照自己的方式去做,以至于我无法看到所有的可能性。我拆分了注释字符串并保存了所有 bbcode 的字符串。然后我将所有这些发送到 bbcodelibrary。其余的字符串在超级正则表达式中运行良好。完美的。非常感谢!
    【解决方案2】:

    最好先解析[url] BBCodes,然后将任何裸露的URL 做成链接。这很容易通过使用否定的lookbehind来实现,以确保URL之前没有双引号。这是有效的,因为您应该已经将原始字符串中的引号转换为 &amp;quot;,因此 URL 之前的任何实际引号都必须作为链接创建者的一部分放在那里。

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 2012-08-05
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多