正则表达式PHP preg_match_all

时间:2015-01-21 22:54:10

标签: php html regex

我从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*?.*?)*)的解释?

2 个答案:

答案 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

演示:https://regex101.com/r/bA4mT7/1

相关问题