У меня есть следующее регулярное выражение:
\[([^ -\]]+)( - ([^ -\]]+))+\]
Это соответствует следующему результату:
[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']