我试图使用正则表达式来解析我拥有的模板。我想找到_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应该不存在。
我在这里做错了什么?
答案 0 :(得分:2)
首先,preg_match
只返回一个匹配项。请改用preg_match_all
。其次,你得到的指数1和2是你的捕获组。你可以简单地忽略它们,尽管你的第二个捕获组是多余的;你可以删除你的正则表达式中的第二对或括号。使用preg_match_all
将产生所有匹配的完整匹配和所有捕获组。
我还认为你应该逃避{
和}
因为它们是正则表达式元字符。我想知道为什么引擎不会以这种方式扼杀它们,但我认为最好还是逃避它们。