除了正确的匹配之外,PHP preg_match_all给出的偏移量为-1

时间:2011-12-05 13:03:45

标签: php regex preg-match

这似乎是一种奇怪的行为,或者我可能不太了解正则表达式......

我正在使用它来查找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?

2 个答案:

答案 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)@'