Я пытаюсь получить все совпадения слова, которое повторяется в скобках.
$text = '{yes yes no yes} yes {yes no}';
Желаемый вывод для слова «да»:
Array
(
[1] => Array
(
[0] => Array
(
[0] => yes
[1] => 1
)
)
[1] => Array
(
[0] => Array
(
[0] => yes
[1] => 5
)
)
[2] => Array
(
[0] => Array
(
[0] => yes
[1] => 12
)
)
[3] => Array
(
[0] => Array
(
[0] => yes
[1] => 22
)
)
)
Я пробовал следующее регулярное выражение, но он возвращает только слово в последней позиции:
preg_match_all("#\{[^}]*(yes)[^{]*\}#", $text, $matches, PREG_OFFSET_CAPTURE);
Я пробовал много других решений, но ничего не работает. Любая идея?
Вы можете попробовать приведенное ниже регулярное выражение, которое использует положительный прогноз, чтобы соответствовать всей строке yes
который присутствовал внутри {}
,
<?php
$string = "{yes yes no yes} yes {yes no}";
preg_match_all("#yes(?=[^{}]*})#", $string, $matches, PREG_OFFSET_CAPTURE);
echo print_r($matches);
?>
Выход:
Array
(
[0] => Array
(
[0] => Array
(
[0] => yes
[1] => 1
)
[1] => Array
(
[0] => yes
[1] => 5
)
[2] => Array
(
[0] => yes
[1] => 12
)
[3] => Array
(
[0] => yes
[1] => 22
)
)
)
Вы можете создать регулярное выражение, чтобы соответствовать до конца }
, затем выполните другое регулярное выражение.
<?php
$string = "{yes yes no yes} yes";
$matches = array();
preg_match_all("/yes[^}]*/", $string, $matches);
echo print_r($matches, true);
$final_matches = array();
preg_match_all("/yes/", "{".$matches[0][0], $final_matches, PREG_OFFSET_CAPTURE);
echo print_r($final_matches, true);
Окончательный вывод:
Array
(
[0] => Array
(
[0] => Array
(
[0] => yes
[1] => 1
)
[1] => Array
(
[0] => yes
[1] => 5
)
[2] => Array
(
[0] => yes
[1] => 12
)
)
)