0

我有一堆文字,例如:

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

4

3 回答 3

3

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

(.*?)

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

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

#{pdf}.*?{/pdf}#
于 2012-11-16T11:43:46.703 回答
1

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

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

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

#{pdf}(?:.*?){/pdf}#
于 2012-11-16T11:40:16.677 回答
1

你没有两个结果。

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

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

于 2012-11-16T11:44:46.220 回答