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

时间:2012-11-16 11:38:08

标签: php regex match curly-brackets

我有一堆文字,例如:

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}文字?

3 个答案:

答案 0 :(得分:3)

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

(.*?)

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

只需尝试以下方法即可摆脱群组:

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

你没有两个结果。

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

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