复杂的正则表达式。如何在多个阶段执行

时间:2014-03-26 13:58:37

标签: php regex

以下是我要过滤的内容:

YO_{
    YO_{
        YO_{
            McDonalds.
        }
    }
}

现在,我想过滤掉 YO _ {和}之间的文字。我这样做了:

$another_var = preg_replace_callback(
    '/YO\_\{(.*?)\}/s',
    function($matches) {
        return $matches[1];
    },
    $variable_where_the_content_is_stored
);

但它正在回归:

YO_{
    YO_{
        McDonalds.
    }
}

而不是返回麦当劳

如何让过滤进程(正则表达式)经历多个阶段?

代码只是一个例子,它只使用了我尝试构建的概念。实际的代码更复杂,可能会产生混淆。我只需要经历多个过滤阶段的想法。

谢谢! :)

4 个答案:

答案 0 :(得分:0)

以下是工作代码:检查修复内部的注释。

print preg_replace_callback(
    '/.*YO\_\{\s*([^}]*?)\s*\}.*/s',  // mistake 1 check \s*([^}]*?)\s* and .*
    function($matches) {
        return $matches[1];  // mistake 2
    },
    $variable_where_the_content_is_stored
);

但是,您也可以使用preg_match()

执行此操作
preg_match('/.*YO\_\{\s*([^}]*?)\s*\}/s', $variable_where_the_content_is_stored, $m);
print $m[1];

答案 1 :(得分:0)

您可能希望查看递归正则表达式。见http://www.regular-expressions.info/recurse.html。最新版本的php确实支持递归正则表达式。

答案 2 :(得分:0)

你可以实际改变你的正则表达式并使用匹配:

YO_\{[^{}]+\}

regex101 demo

[^{}]+将匹配非{}个字符。

如果您希望内部文本没有空格,可以使用:

YO_\{\s*([^{}]+?)\s*\}

并提取包含匹配项的数组的第一个元素。

答案 3 :(得分:0)

您可以将此recursive regex pattern与前瞻阴影一起使用:

$str = <<< EOF
YO_{
    YO_{
        YO_{
            McDonalds.
        }
    }
}
EOF;
if (preg_match('/ YO_ (?!.*?YO_) \{ ( (?: [^{}]* | (?0) )* ) \} /sx', $str, $arr))
   echo(trim($arr[1])); // McDonalds.