0

我正在尝试使用正则表达式来解析我拥有的模板。我想找到_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 不应该存在。

我在这里做错了什么?

4

1 回答 1

2

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

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

于 2012-10-22T17:22:45.207 回答