Получить все слова и их смещения в скобках

Я пытаюсь получить все совпадения слова, которое повторяется в скобках.

$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);

Я пробовал много других решений, но ничего не работает. Любая идея?

1

Решение

Вы можете попробовать приведенное ниже регулярное выражение, которое использует положительный прогноз, чтобы соответствовать всей строке 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
)

)

)
0

Другие решения

Вы можете создать регулярное выражение, чтобы соответствовать до конца }, затем выполните другое регулярное выражение.

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

https://eval.in/196020

Окончательный вывод:

Array
(
[0] => Array
(
[0] => Array
(
[0] => yes
[1] => 1
)

[1] => Array
(
[0] => yes
[1] => 5
)

[2] => Array
(
[0] => yes
[1] => 12
)

)

)
0

По вопросам рекламы [email protected]