【问题标题】:Get position of all matches in group获取组中所有比赛的位置
【发布时间】:2009-11-25 21:59:21
【问题描述】:

考虑以下示例:

$target = 'Xa,a,aX';
$pattern = '/X((a),?)*X/';
$matches = array();
preg_match_all($pattern,$target,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);
var_dump($matches);

它只返回系列中的最后一个“a”,但我需要的是所有的“a”。

特别是,我需要 ALL EACH OF 'a 在字符串中的位置单独,因此需要 PREG_OFFSET_CAPTURE。

示例要复杂得多,请参阅相关问题:pattern matching an array, not their elements per se

谢谢

【问题讨论】:

  • 如果这个描述不能很好地代表你的实际问题,为什么要开始这篇新文章呢?
  • 它被简化了,它是我复杂问题的另一个“子问题”,它可以看作是一个独立的问题,有自己的解决方案。
  • 目标是否可以包含多个a的列表,例如:'abcdXa,a,a,aXefghiXa,a,a,a,a,a,a,aX'?如果是这样,在这种情况下,您需要两个单独的数组,一个用于每个 a 的列表,还是一个包含所有 a 的索引的组合数组,无论它们来自哪里?
  • 不,只有一对X,没有嵌套什么的。我需要在目标中可以找到 a 的每个位置。

标签: php regex pcre


【解决方案1】:

由于正则表达式 X((a),?)*X 匹配整个字符串,因此它将单个匹配分组。最后一个((a),?) 将被分组。

您要匹配的是a,它前面有一个X(和字符串的开头),前面有一个逗号,或者前面有一个X(和结尾字符串)。

$target = 'Xa,a,aX';
$pattern = '/(?<=^X)a|a(?=X$|,)/';
preg_match_all($pattern, $target, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);

输出:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => a
                    [1] => 1
                )

            [1] => Array
                (
                    [0] => a
                    [1] => 3
                )

            [2] => Array
                (
                    [0] => a
                    [1] => 5
                )

        )

)

【讨论】:

    【解决方案2】:

    当您的正则表达式包含 X 时,它匹配一次。它会找到一个包含组的大型匹配项。您想要的是许多匹配项,每个匹配项都有自己的位置。

    所以,在我看来,你能做的最好的事情就是简单地搜索 /a/ 或 /a,?/ 而没有任何 X。然后 matches[0] 将包含所有出现的“a”

    如果在 X 之间需要它们,请预先选择这部分字符串。

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 2018-09-06
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多