繁体   English   中英

PHP,preg_match_all,使用PREG_OFFSET_CAPTURE的匹配组中的意外匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM