preg_match反向引用以查找结束标记

时间:2012-10-22 17:18:47

标签: regex preg-match

我试图使用正则表达式来解析我拥有的模板。我想找到_stop标记的_start标记。我需要找到具体的标签,因为可以嵌套_stop_start标签。

我使用的正则表达式是

/{(.*?)_start}.*{(\1_stop)}/s

并将其投入preg_match

和模板

<div data-role="collapsible-set" class="mfe_collapsibles" data-theme="c" data-inset="false">
        {MakeAppointment_start}
        <div id="appointmentHeading" data-action-id="appointmentNext" data-action-text="Next" data-a data-role="collapsible" data-collapsed="true" data-collapsed-icon="arrow-r" data-expanded-icon="arrow-d" data-iconpos="right">
            <h3 class="collapsibleMainHeading">New {AppointmentTerm}</h3>
            <p>
                {AppointmentForm}
            </p>
        </div>
        {MakeAppointment_stop}
        {RegisterSection_start}
        <div id="registerHeading" class="preRegistration" data-action-id="register" data-action-text="Register" data-role="collapsible" data-collapsed="true" data-collapsed-icon="arrow-r" data-expanded-icon="arrow-d" data-iconpos="right">
            <h3 class="collapsibleMainHeading">Register</h3>
            <p>
                {RegisterForm}
            </p>
        </div>
        {RegisterSection_stop}
        <div data-role="collapsible" class="preRegistration" data-collapsed="true" data-collapsed-icon="arrow-r" data-expanded-icon="arrow-d" data-iconpos="right">
            <h3 class="collapsibleMainHeading">Login</h3>
            <p>
                {LoginForm}
            </p>
        </div>

    </div>
</div>

结果

Array
(
    [0] => {MakeAppointment_start}
        <div id="appointmentHeading" data-action-id="appointmentNext" data-action-text="Next" data-a data-role="collapsible" data-collapsed="true" data-collapsed-icon="arrow-r" data-expanded-icon="arrow-d" data-iconpos="right">
            <h3 class="collapsibleMainHeading">New {AppointmentTerm}</h3>
            <p>
                {AppointmentForm}
            </p>
        </div>
        {MakeAppointment_stop}
    [1] => MakeAppointment
    [2] => MakeAppointment_stop
)

索引0是正确的,但1和2不是。 1应该有寄存器标签和内容,2应该不存在。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

首先,preg_match只返回一个匹配项。请改用preg_match_all。其次,你得到的指数1和2是你的捕获组。你可以简单地忽略它们,尽管你的第二个捕获组是多余的;你可以删除你的正则表达式中的第二对或括号。使用preg_match_all将产生所有匹配的完整匹配和所有捕获组。

我还认为你应该逃避{}因为它们是正则表达式元字符。我想知道为什么引擎不会以这种方式扼杀它们,但我认为最好还是逃避它们。