只匹配内部HTML?

时间:2014-08-07 09:00:55

标签: javascript regex

我正在编写一个模板引擎,我的语法如下:

{{If "{{Line}}" != ""}}
    {{If "{{Line}}" != ""}}
        <li id="{{Required:Id}}" class="menuEntry line">
    {{EndIf}}
    <li id="{{Required:Id}}" class="menuEntry line">
{{EndIf}}

现在,我正在搜索正则表达式以获取我的if语句,这意味着从{{If{{EndIf}}之间的所有内容都应包括在内。

我想出了正则表达式:

/({{If)[.]*?[\s\S]*?({{EndIf}})/g

当我只有1个if语句时,这确实可行,但是对于嵌套的if语句,它会出错。

上面的正则表达式会给我:

{{If "{{Line}}" != ""}}
    {{If "{{Line}}" != ""}}
    <li id="{{Required:Id}}" class="menuEntry line">
   {{EndIf}}

事实上,我期待检索:

    {{If "{{Line}}" != ""}}
    <li id="{{Required:Id}}" class="menuEntry line">
   {{EndIf}}

任何可以在这里为我提供指导的人吗?

3 个答案:

答案 0 :(得分:1)

(\{\{If)((?:(?!\{\{If \"\{\{Line\}\}\" \!= \"\"\}\}|\{\{EndIf\}\}).)*)?(\{\{EndIf\}\})/sg

试试这可能会对你有所帮助

答案 1 :(得分:0)

除了使用匹配所有内容的.*?(包括{{If),您可以使用与{{If之外的所有内容匹配的否定前瞻:(?!.*{{If)

你的正则表达式(你可以test it here):

/{{If(?!.*{{If).*?{{EndIf}}/gs

由于Javascript没有 dotall 修饰符s以允许点也匹配换行符,因此您可以使用类及其否定而不是.(如所解释的) here)。然后你正则表达式(测试它here):

/{{If(?![\s\S]*?{{If)[\s\S]*?{{EndIf}}/g

答案 2 :(得分:0)

在JavaScript中,您可以尝试:

}}\s+({{If [\s\S]*?{{EndIf}})

从索引1获取匹配的组

这是DEMO

以下是代码:

var myString = '...';
var myRegexp = /}}\s*({{If [\s\S]*?{{EndIf}})/gi;
var match = myRegexp.exec(myString);
alert(match[1]);

Read more...