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

时间:2014-09-20 10:11:56

标签: php regex preg-match-all

我试图将一个单词的所有匹配重复到括号中。

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

我尝试了很多其他解决方案,但没有任何效果。有什么想法吗?

2 个答案:

答案 0 :(得分: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
                )

        )

)

答案 1 :(得分:0)

您可以尝试使用以下正则表达式使用正向前瞻来匹配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
                )

        )

)