我有一堆文本,例如:
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}#