PHP regex groups captures
I have the following regex:
\[([^ -\]]+)( - ([^ -\]]+))+\]
This match the following successfully:
[abc - def - ghi - jkl]
BUT the match is:
Array
(
[0] => [abc - def - ghi - jkl]
[1] => abc
[2] => - jkl
[3] => jkl
)
What I need is something like this:
Array
(
[0] => [abc - def - ghi - jkl]
[1] => abc
[2] => - def
[3] => def
[4] => - ghi
[5] => ghi
[6] =>开发者_如何学Python; - jkl
[7] => jkl
)
I'm able to do that in C# looking at the groups "captures". How can I do that in PHP?
This is not the job for the regexp. Match against \[([^\]]*)\]
, then explode
the first capture by the " - "
.
<?php
$str = "[abc - def - ghi - jkl]";
preg_match('/\[([^\]]*)\]/', $str, $re);
$strs = explode(' - ', $re[1]);
print_r($strs);
?>
Assuming the tokens in your sample string never contain spaces, and are alphanumeric:
<?php
$pattern = "/([\w|\d])+/";
$string = "[abc - 123 - def - 456 - ghi - 789 - jkl]";
preg_match_all($pattern, $string, $matches);
print_r($matches[0]);
?>
Output:
Array
(
[0] => abc
[1] => 123
[2] => def
[3] => 456
[4] => ghi
[5] => 789
[6] => jkl
)
SPL preg_match_all will return regex groups starting on index 1 of the $matches
variable. If you want to get only the second group you can use $matches[2]
for example.
Syntax:
$matches = array();
preg_match_all(\
'/(He)\w+ (\w+)/',
"Hello world\n Hello Sunshine",
$matches
);
var_dump($matches);
Result:
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. This answer is posted for the context of the question title after being directed here by a Google search. This was the information I was interested in when searching for this topic.
To group your matches, use parenthesize. EG:
$string = 'bob';
preg_match('/bob/', $string, $matches);
$matches
will be ['bob']
preg_match('/(b)(o)(b)/', $string, $matches);
$matches
will be ['bob','b','o','b']
精彩评论