获取括号之间的所有单词及其偏移量


Get all words and their offsets between brackets

我正在尝试获取一个重复到括号中的单词的所有匹配项。

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

我尝试过以下regex,但它只返回最新位置的单词:

preg_match_all("#'{[^}]*(yes)[^{]*'}#", $text, $matches, PREG_OFFSET_CAPTURE);

我尝试过许多其他解决方案,但都不起作用。知道吗?

您可以尝试下面的regex,它使用正向前瞻来匹配{}、中存在的所有字符串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);

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