这似乎是一种奇怪的行为,或者我可能不太了解正则表达式......
我正在使用它来查找PDF文件中的所有外部参照和预告片对象:
preg_match_all('@(\nxref\r?\n)|(\strailer\s)@',$pdfcontent,$matches,PREG_OFFSET_CAPTURE);
print_r给了我这个:
Array
(
[0] => Array
(
[0] => Array
(
[0] =>
xref
[1] => 13235519
)
[1] => Array
(
[0] =>
trailer
[1] => 13299371
)
)
[1] => Array
(
[0] => Array
(
[0] =>
xref
[1] => 13235519
)
[1] => Array
(
[0] =>
[1] => -1
)
)
[2] => Array
(
[0] =>
[1] => Array
(
[0] =>
trailer
[1] => 13299371
)
)
)
为什么xref的位置为-1?
答案 0 :(得分:3)
这似乎是正常行为,但大多数情况下没有记录。用于缺席匹配的-1
偏移也。
要回答您的标题,-1
偏移量将返回或,而不是添加。您的模式中有另一个(a)|(b)
匹配组。因此,它可以很好地返回xref
的偏移和匹配,但是trailer
不匹配。
这在PHP手册页中没有明确提及。但PCRE documents it cursorily与:
[...]当发生这种情况时,偏移对中的两个值都相关 对未使用的子模式的设置设置为-1。
您可以使用更简单的示例重现它:
preg_match_all('/(a)|(b)|(c)/', "abc", $m, PREG_OFFSET_CAPTURE)
and print_r($m);
[看看]。这种行为有点令人困惑。似乎-1
用作早期非匹配的偏移量。但是后续失败的匹配在结果数组中不存在。例如,此示例提供了[0,-1,-1]
和[undef,1,-1]
以及[undef,undef,2]
。我会在PHP wrapper中得出一些模糊的行为。
答案 1 :(得分:2)
在我看来,你有两个xref
而中间没有trailer
。类似的东西:
xref
shgfjqhfkj
xref
shgfjqhfkj
trailer
匹配组错了。
我将改变正则表达式:
'@(\nxref\r?\n|\strailer\s)@'