我有以下正则表达式:
\[([^ -\]]+)( - ([^ -\]]+))+\]
以下成功匹配:
[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做到这一点?
答案 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);