regex PHP正则表达式组捕获

1qczuiv0  于 2023-01-27  发布在  PHP
关注(0)|答案(4)|浏览(140)

我有下面的正则表达式:

\[([^ -\]]+)( - ([^ -\]]+))+\]

成功匹配以下内容:

[abc - def - ghi - jkl]

但比赛是:

Array
(
    [0] => [abc - def - ghi - jkl]
    [1] => abc
    [2] =>  - jkl
    [3] => jkl
)

我需要的是这样的东西:

Array
(
    [0] => [abc - def - ghi - jkl]
    [1] => abc
    [2] =>  - def
    [3] => def
    [4] =>  - ghi
    [5] => ghi
    [6] =>  - jkl
    [7] => jkl
)

我可以用C#查看组的“捕获”来做到这一点。我怎么能用PHP做到呢?

chy5wohz

chy5wohz1#

这不是regexp的工作。匹配\[([^\]]*)\],然后explode" - "的第一个捕获。

<?php                                                                       
  $str = "[abc - def - ghi - jkl]";
  preg_match('/\[([^\]]*)\]/', $str, $re);
  $strs = explode(' - ', $re[1]);
  print_r($strs);
?>
n3schb8v

n3schb8v2#

假设示例字符串中的标记从不包含空格,并且是字母数字标记:

<?php
    $pattern = "/([\w|\d])+/";
    $string = "[abc - 123 - def - 456 - ghi - 789 - jkl]";
    preg_match_all($pattern, $string, $matches);
    print_r($matches[0]);
?>
    • 输出:**
Array
(
    [0] => abc
    [1] => 123
    [2] => def
    [3] => 456
    [4] => ghi
    [5] => 789
    [6] => jkl
)
wmvff8tz

wmvff8tz3#

SPL preg_match_all将返回从$matches变量的索引1开始的正则表达式组。如果你只想得到第二个组,你可以使用$matches[2]
语法:

$matches = array(); 
preg_match_all(\
    '/(He)\w+ (\w+)/', 
    "Hello world\n Hello Sunshine", 
    $matches
); 
var_dump($matches);

结果:

array(3) {
  [0] =>
  array(2) {
    [0] =>
    string(11) "Hello world"
    [1] =>
    string(14) "Hello Sunshine"
  }
  [1] =>
  array(2) {
    [0] =>
    string(2) "He"
    [1] =>
    string(2) "He"
  }
  [2] =>
  array(2) {
    [0] =>
    string(5) "world"
    [1] =>
    string(8) "Sunshine"
  }
}

这个答案是在谷歌搜索的指引下发布的问题标题的上下文。这是我在搜索这个主题时感兴趣的信息。

9gm1akwq

9gm1akwq4#

要对匹配项进行分组,请使用括号。例如:

$string = 'bob';
preg_match('/bob/', $string, $matches);

$matches将为['bob']

preg_match('/(b)(o)(b)/', $string, $matches);

$matches将变为['bob','b','o','b']

相关问题