【问题标题】:Regex matching between curly brackets yields too many results大括号之间的正则表达式匹配会产生太多结果
【发布时间】:2012-11-16 11:38:07
【问题描述】:

我有一堆文字,例如:

foofoofooabcdefhjkldh389dn{pdf}images/1.pdf,100%,500{/pdf}hfnkjt8499duidjglkj

我想提取以下内容:

{pdf}images/1.pdf,100%,500{/pdf}

所以这是我制作的正则表达式:

#{pdf}(.*?){/pdf}#

检查结果时我回来了:

Array
(
[0] => {pdf}images/1.pdf,100%,500{/pdf}
[1] => images/1.pdf,100%,500
)

我希望只获得数组中的第一项,但实际上有两项。 我正在使用 PHP,我使用以下网站进行测试:PHP Regex Tester

如何只获取{pdf}...{/pdf} 文字?

【问题讨论】:

    标签: php regex match curly-brackets


    【解决方案1】:

    您在正则表达式中使用组。在您的情况下,该组是

    (.*?)
    

    这会导致 PHP 为您提供完整的结果 {PDF}sometext{/PDF} 以及在第一组中找到的 sometext。

    只需尝试以下方法来摆脱该组:

    #{pdf}.*?{/pdf}#
    

    【讨论】:

      【解决方案2】:

      你没有两个结果。

      这里的问题(虽然不是问题)可能是使用了函数preg_match。该函数返回整个匹配查询,即{pdf}images/1.pdf,100%,500{/pdf},以及最终结果,即images/1.pdf,100%,500。

      所以您只需要使用$result[1] 进行进一步解析。

      【讨论】:

        【解决方案3】:

        使用非捕获组,以确保中心文本不会在数组中显示为反向引用,并使用零宽度断言来确保 {pdf} 部分不是匹配的一部分:

        #(?<={pdf})(?:.*?)(?={/pdf})#
        

        如果您想保留{pdf} 分隔符:

        #{pdf}(?:.*?){/pdf}#
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-06
          • 1970-01-01
          • 2020-02-24
          • 2018-12-02
          • 1970-01-01
          • 1970-01-01
          • 2015-10-28
          相关资源
          最近更新 更多