PHP preg_match_除了正确的匹配之外,还提供-1的偏移量
这似乎是一种奇怪的行为,或者我不太理解正则表达式 我正在使用它查找PDF文件中的所有外部参照和尾部对象:PHP preg_match_除了正确的匹配之外,还提供-1的偏移量,php,regex,preg-match,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 (
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
)
)
)
为什么外部参照的位置为-1?这似乎是正常的行为,但大多没有记录在案。
-1
偏移量也用于不存在的匹配
要回答标题,将交替返回-1
偏移量,而不是附加返回。您的模式中有一个可选的(a)|(b)
匹配组。因此,它可以很好地为外部参照
返回偏移和匹配,但为尾部
返回不匹配
PHP手册页面中没有明确提到这一点。但PCRE具有:
[…]发生这种情况时,偏移量对中的两个值都会对应-
对未使用子模式的响应设置为-1
您可以用一个更简单的例子来重现它:
preg_match_all('/(a)|(b)|(c)/', "abc", $m, PREG_OFFSET_CAPTURE)
and print_r($m);
[看一看]。这种行为有点令人困惑。似乎将
-1
用作早期非匹配的偏移量。但随后的失败匹配只是在结果数组中不存在。例如,本例给出了[0,-1,-1]
和[unde,1,-1]
和[unde,unde,2]
。我会得出结论,这是一种模糊的行为。这似乎是正常的行为,但大多没有记录在案。-1
偏移量也用于不存在的匹配
要回答标题,将交替返回-1
偏移量,而不是附加返回。您的模式中有一个可选的(a)|(b)
匹配组。因此,它可以很好地为外部参照
返回偏移和匹配,但为尾部
返回不匹配
PHP手册页面中没有明确提到这一点。但PCRE具有:
[…]发生这种情况时,偏移量对中的两个值都会对应-
对未使用子模式的响应设置为-1
您可以用一个更简单的例子来重现它:
preg_match_all('/(a)|(b)|(c)/', "abc", $m, PREG_OFFSET_CAPTURE)
and print_r($m);
[看一看]。这种行为有点令人困惑。似乎将
-1
用作早期非匹配的偏移量。但随后的失败匹配只是在结果数组中不存在。例如,本例给出了[0,-1,-1]
和[unde,1,-1]
和[unde,unde,2]
。我认为这是一种模糊的行为。在我看来,你有2个xref
,中间没有拖车。比如:
xref
shgfjqhfkj
xref
shgfjqhfkj
trailer
而匹配组是错误的
我会用以下内容更改正则表达式:
'@(\nxref\r?\n|\strailer\s)@'
在我看来,您有两个外部参照
,中间没有拖车
。比如:
xref
shgfjqhfkj
xref
shgfjqhfkj
trailer
而匹配组是错误的
我会用以下内容更改正则表达式:
'@(\nxref\r?\n|\strailer\s)@'
-1表示正则表达式匹配,通常表示未找到匹配项。已找到匹配项。第二次出现时,它给出了匹配值和-1值。有人能给我解释一下吗,或者你只是想嘲笑我的愚蠢,而我搔搔头?虽然我不是选民中的一员,但这不是一个很清楚的问题。您的问题是“PHP preg_match_all giving offset of-1”,我的评论回答了您的问题。你并没有说你想用你的正则表达式模式找到什么,所以我们怎么可能知道它是对的还是错的。所以,请添加您正在搜索的内容。PDF文件是10MB,我不能在这里发布。我的代码所做的一切与我发布的完全一样,即在文件中搜索“xref”或“trailer”的出现。这不是问题所在。问题是这是否是preg_match_all的正常行为。如果查看打印结果,您可以看到索引0每个都有一个查找,索引1有两个查找,包括-1,索引2有两个查找,只有一个是空数组。我觉得这听起来不像是正常的行为。也许下层选民想解释一下,这对他们来说是否如此明显。-1对于正则表达式匹配通常意味着没有找到匹配项。找到了匹配项。第二次出现时,它给出了匹配值和-1值。有人能给我解释一下吗,或者你只是想嘲笑我的愚蠢,而我搔搔头?虽然我不是选民中的一员,但这不是一个很清楚的问题。您的问题是“PHP preg_match_all giving offset of-1”,我的评论回答了您的问题。你并没有说你想用你的正则表达式模式找到什么,所以我们怎么可能知道它是对的还是错的。所以,请添加您正在搜索的内容。PDF文件是10MB,我不能在这里发布。我的代码所做的一切与我发布的完全一样,即在文件中搜索“xref”或“trailer”的出现。这不是问题所在。问题是这是否是preg_match_all的正常行为。如果查看打印结果,您可以看到索引0每个都有一个查找,索引1有两个查找,包括-1,索引2有两个查找,只有一个是空数组。我觉得这听起来不像是正常的行为。也许下层选民想解释一下,这对他们来说是否如此显而易见。