Php 嵌套{**}的这个正则表达式模式有什么错误?

Php 嵌套{**}的这个正则表达式模式有什么错误?,php,regex,preg-replace,pattern-matching,Php,Regex,Preg Replace,Pattern Matching,我有这个HTML文档 {* <h2 class="block_title bg0">ahmooooooooooooooooooooooooooooooooooooooooooodi</h2> <div class="block_content padding bg0">{welc_msg}</div> <br/> {* hii<br /><span>5 *} {* hii

我有这个HTML文档

{*
<h2 class="block_title bg0">ahmooooooooooooooooooooooooooooooooooooooooooodi</h2>
<div class="block_content padding bg0">{welc_msg}</div>
<br/>
    {*
    hii<br /><span>5
    *}

    {*
    hii<br /><span>5

    *}
*}
它是有效的,但不是理想的100%,它在最后留下了
*}

你能告诉我真实的模式吗?

你需要一个匹配嵌套括号的。应该是这样的:

"#(\{\*([^{}]*?(?R)[^{}]*?)\*\})+#isx"

如果您的正则表达式引擎支持匹配的嵌套结构(PHP支持),那么您可以在一次过程中删除(可能是嵌套的)元素,如下所示:

一次通过应用递归正则表达式:
函数条带嵌套元素递归($text){
返回预更换('/
#匹配最外层(可嵌套)“{*..*}”元素。
\{\*#元素开始标记序列。
(?:#将零个或多个元素内容分组。
[^{*]++#一个或多个非起始标记字符。
|\{(?!\*)或“{”不是开始标记的开头。
|\*(?!\})或“*”不是结束标记的开头。
|(?R)#或有效的嵌套匹配标记元素。
)*#零个或多个元素内容备选方案。
\*\}#元素结束标记序列。
/x','',$text);
}
上面的递归正则表达式与最外层的
{*..*}
元素匹配,该元素可能包含嵌套元素

但是,如果您的正则表达式引擎不支持匹配的嵌套结构,您仍然可以完成任务,但不能一次性完成。可以创建与最内层的
{*.*}
元素匹配的正则表达式(即不包含任何嵌套元素的正则表达式)。此正则表达式可以递归方式应用,直到文本中没有其他元素,如下所示:

递归应用的非递归正则表达式:
函数条带NesteDelements非递归($text){
$re=/
#匹配最里面的(非嵌套的)“{*..*}”元素。
\{\*#元素开始标记序列。
(?:#将零个或多个元素内容分组。
[^{*]++#一个或多个非起始标记字符。
|\{(?!\*)或“{”不是开始标记的开头。
|\*(?!\})或“*”不是结束标记的开头。
)*#零个或多个元素内容备选方案。
\*\}#元素结束标记序列。
/x′;
while(preg_match($re,$text)){
$text=preg_replace($re,,$text);
}
返回$text;
}
使用正则表达式处理嵌套结构是一个高级主题,必须小心处理!如果真的想将正则表达式用于此类高级应用程序,我强烈建议您阅读杰弗里·弗里德尔(Jeffrey Friedl)的经典著作。老实说,这是我读过的最有用的一本书


快乐Regexing!

你需要使用一个来匹配嵌套结构吗?请怎么做?在你的嵌套模式语言不是之前我没有编写递归正则表达式。因此你不能使用(正常)正则表达式。但是你可以在这里使用。关闭,但是
\{*([^{}]*?(?R)[^{}]*?)\*}
如果元素包含一个独立的
{
例如“
{*与{这些}内容*}}
不匹配”@ridgerunner:是的,我完全忽略了分隔符由两个字符组成:-/我不会修正它(并使正则表达式比现在更不可读),我只会对你的答案投赞成票!
"#(\{\*([^{}]*?(?R)[^{}]*?)\*\})+#isx"