Группы регулярных выражений PHP фиксируют

У меня есть следующее регулярное выражение:

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

Это соответствует следующему результату:

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

Это не задание для регулярного выражения. Сопоставьте с \[([^\]]*)\] , затем split первый захват на " - " .

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

Предполагая, что токены в вашей строке образца не содержат пробелов и являются буквенно-цифровыми:

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

SPL preg_match_all вернет группы регулярных выражений, начиная с индекса 1 переменной $matches matches. Если вы хотите получить только вторую группу, вы можете использовать $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" } } 

PS Этот ответ публикуется для контекста заголовка вопроса после направления его поиском в Google. Это была информация, которую меня интересовала при поиске этой темы.

Чтобы сгруппировать свои совпадения, используйте круглые скобки. НАПРИМЕР:

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

$matches будет ['bob']

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

$matches будут ['b','o','b']