大括号之间的正则表达式匹配会产生太多结果



我有一堆文本,例如:

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 给你完整的结果 {PDF}sometext{/PDF} 和在第一组中找到的 sometext。

只需尝试以下操作即可摆脱该组:

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

您没有两个结果。

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

因此,您只需要使用$result[1]进行进一步解析。

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

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

如果要保留{pdf}分隔符:

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

最新更新