【问题标题】:Don't match the URL's between BBCode tags不匹配 BBCode 标签之间的 URL
【发布时间】:2014-05-17 19:28:09
【问题描述】:

正如标题所说,我希望我的模式与字符串中的 URL 匹配,除了那些在 BBCode 标记之间的模式。

到目前为止,我制作的模式与[img] 标签之间的 URL 不匹配,但没有足够的正则表达式技能使其适用于所有标签,例如更高级的一次([url=xxx]yyy[/url] 等)。所以要明确一点:[] 之间的没有应该匹配。


这是我的 工作示例 与 [img] 标记之间的 URL 不匹配:

http://regexr.com/v1?38mae(由于编码混乱,可能必须粘贴以下模式)

图案:

(?<!\[img])(((http|ftp|https):\/\/)|www\.)[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#!]*[\w\-\@?^=%&/~\+#])

我将不胜感激!

【问题讨论】:

    标签: php regex preg-match bbcode


    【解决方案1】:

    您可以在模式的开头添加以下内容:

    \[[^]]*](*SKIP)(*FAIL)|
    

    此子模式将查找方括号之间的所有内容,使模式失败并强制不重试子字符串。

    以您的模式为例(以~ 作为分隔符):

    $pattern = '~\[[^]]*](*SKIP)(*FAIL)|
                 (?<!\[img])
                 (?:(?:ht|f)tps?://|www\.)
                 [\w-]+
                 (?:\.[\w-]+)+
                 [\w-.,@?^=%&:/\~+#!]*[\w-@?^=%&/\~+#]~xiu';
    

    【讨论】:

    • 听起来不错,但由于某种原因对我不起作用。你能把它放在正则表达式上吗?
    • @Cyclone:用真正的 php 代码测试它,而不是在正则表达式测试器上。
    • @CasimiretHippolyte 哇,这真是太天才了。我不明白为什么它不能在正则表达式测试器上工作。
    • @Lucas:并非所有 PHP 正则表达式测试器都实现了回溯控制动词,例如 (*SKIP)(*FAIL)。但是我知道regex101.comregex.larsolavtorvik.com 实现了这些功能(如果您测试它,请注意分隔符)。
    • @CasimiretHippolyte 整洁!谢谢!!
    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2016-09-27
    • 2012-04-26
    • 2020-05-14
    相关资源
    最近更新 更多