我从WWW获得了这段代码:
private function initialize_loops($template){
preg_match_all('/{LOOP:([w]+)[^}]*}((s*?.*?)*){\/LOOP:\1}/', $template, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
$template = str_ireplace($match[0], '<!–LOOP('.$match[1].')–>', $template);
$this->loop_templates[strtoupper($match[1])] = $match[2];
if(!array_key_exists(strtoupper($match[1]), $this->loops)){
$this->loops[strtoupper($match[1])] = array();
}
}
return $template;
}
输入字符串是:(例如)
<tbody>
{LOOP:USERLIST}
<tr>
<td>{VAR:ID}</td>
<td>{VAR:D-NAME}</td>
<td>{VAR:ROLE}</td>
<td>{VAR:ACTIONS}</td>
</tr>
{/LOOP:USERLIST}
</tbody>
我不知道他们在代码中创建了RegEx的原因是什么,因为它不起作用!
我试图让它在ReExr.com上运行,到目前为止我已经:
/{LOOP:([^}]+)}((s*?.*?)*){\/LOOP:\1}/img
这仍然不起作用{LOOP:([^}]+)}{\/LOOP:\1}
已经适用于{LOOP:USERLIST}{/LOOP:USERLIST}
。
所以我的问题是中间部分:((s*?.*?)*)
我绝对不知道为什么表达式中的s或者它应该如何工作。希望有人有建议怎么做?或((s*?.*?)*)
的解释?
答案 0 :(得分:3)
可能只是缺少反斜杠:
((\s*?.*?)*)
乍一看,似乎他们想分别解析前导空格。但是,这并不能解释为什么空间与其余空间处于相同的模式组中。
另一种可能性是他们注意到.
与新行不匹配。但不是使用适当的pattern modifier&#34; s&#34; (PCRE_DOTALL),他们试图通过\s
空格模式捕获换行符。
无论哪种方式,只要忽略那个垃圾。以下正则表达式应该可以解决这个问题:
'/{LOOP:([^}]+)}(.*?){\/LOOP:\1}/sg'
顺便说一句,我不明白你为什么要添加&#34; i&#34;。请不要这样做。我认为模板系统与{LoOp:test}...{/loOP:test}
匹配是一个很好的设计。
此外,添加&#34; m&#34;没有任何意义。修饰符,因为正则表达式不包含任何锚点,^
和$
。
答案 1 :(得分:0)
添加s
修饰符,您可以删除m
修饰符。 s
使.
与新行匹配。我也编辑了一下:
/{LOOP:([^}]+)}(.*?){\/LOOP:\1}/igs