PHP正则表达式组捕获

时间:2011-04-12 23:35:57

标签: php regex

我有以下正则表达式:

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

以下成功匹配:

[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做到这一点?

4 个答案:

答案 0 :(得分:12)

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

<?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
)

答案 1 :(得分:11)

这不是regexp的工作。匹配\[([^\]]*)\],然后split首先捕获" - "

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

答案 2 :(得分:5)

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"
  }
}

P.S。此答案是在Google搜索引导后发布的问题标题的上下文。这是我在搜索此主题时感兴趣的信息。

答案 3 :(得分:4)

要对匹配进行分组,请使用parenthesize。 EG:

if else

def roundSmart[A](num: A)(implicit numeric: Numeric[A]) = { import numeric._ if (abs(num) < fromInt(1)) toDouble(num) else toInt(num) } 将为$string = 'bob'; preg_match('/bob/', $string, $matches);

$matches

['bob']将为preg_match('/(b)(o)(b)/', $string, $matches);