![](/img/trans.png)
[英]PHP preg_match_all giving offset of -1 in addition to correct matches
[英]PHP, preg_match_all, unexpected matches in matching groups using PREG_OFFSET_CAPTURE
我有以下正则表达式:
/(\bafter[\s_:.,()-]+|\bnach[\s_:.,()-]+|\bd'apres[\s_:.,()-]+|\bd´apres[\s_:.,()-]+|\bCircle of[\s_:.,()-]+)*(Pablo[\s_:.,()-]+Picasso|Picasso[\s_:.,()-]+Pablo)([\s_:.,()-]+Nachfolge\b|[\s_:.,()-]+Nachfolger\b|[\s_:.,()-]+Nachfolgerin\b|[\s_:.,()-]+Werkstatt\b|[\s_:.,()-]+Umkreis\b|[\s_:.,()-]+d'apres\b|[\s_:.,()-]+d´apres\b|[\s_:.,()-]+Circle of\b)*/uim
输入字符串: This is a test Pablo Picasso bla
我正在使用preg_match_all($regex, $input, $matches, PREG_OFFSET_CAPTURE)
来获取所有具有其偏移量的匹配项。
结果:
array(4) {
[0] =>
array(1) {
[0] =>
array(2) {
[0] =>
string(13) "Pablo Picasso"
[1] =>
int(15)
}
}
[1] =>
array(1) {
[0] =>
array(2) {
[0] =>
string(0) ""
[1] =>
int(-1)
}
}
[2] =>
array(1) {
[0] =>
array(2) {
[0] =>
string(13) "Pablo Picasso"
[1] =>
int(15)
}
}
[3] =>
array(1) {
[0] =>
string(0) "" // why is this type string and no array containing empty string + negative offset (-1) as values?
}
}
为什么array[3][0]
(第三个匹配组,第一个匹配项)是一个空字符串,而不是偏移量等于-1
的数组,就像array[1][0]
第一个匹配组,第一个匹配项一样?
array(2) {
[0] =>
string(0) ""
[1] =>
int(-1)
}
如果使用以下输入字符串,则在此位置有一个数组作为匹配结果: This is a test after Pablo Picasso (d'apres)
(因为match (d'apres
)。
参见示例: https : //regex101.com/r/euKHUW/2
环境:
PHP 7.2.12 (cli) (built: Nov 24 2018 18:28:09) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.12, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans
如果没有找到匹配的第三个匹配组,为什么没有数组包含第一个键为空字符串和第二个键为负偏移量( -1
)?
这是模式末尾的可选组,未显示。
实际上,您可以使这些可选的重复组不捕获,并用捕获组将其围起来以始终获取它们,请参见此regex演示 。 然后,您需要检查返回的组是否匹配空字符串。
您还可以采取其他步骤来简化模式:
\\bd'apres[\\s_:.,()-]+|\\bd´apres[\\s_:.,()-]+
可以写为\\bd[´']apres[\\s_:.,()-]+
\\bafter[\\s_:.,()-]+|\\bnach[\\s_:.,()-]+...
可以写为\\b(?:after|nach)[\\s_:.,()-]+
,使用内部非捕获组,并且仅具有重复模式一次。 请参阅修改后的模式:
((?:\b(?:after|nach|d[´']apres|Circle of)[\s_:.,()-]+)*)(Pablo[\s_:.,()-]+Picasso|Picasso[\s_:.,()-]+Pablo)((?:[\s_:.,()-]+(?:(?:Nachfolge(?:r(?:in)?)?|Werkstatt|Umkreis|d['´]apres|Circle of)\b))*)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.