Php Regexp中存在问题

Php Regexp中存在问题,php,regex,preg-replace,pcre,Php,Regex,Preg Replace,Pcre,我有一个Regexp: /\{%\s([^else|endloop|endif][a-z0-9\.\|_]+)\s%\}/si 我在preg_replace中使用这个regexp。 这个标记: {# comment %} {# comment number 2$% %} {% variable %} {% array.key1.key2 %} {% array.key1.key2|escape|bold %} {% variable|escape %} {% loop array

我有一个Regexp:

/\{%\s([^else|endloop|endif][a-z0-9\.\|_]+)\s%\}/si
我在preg_replace中使用这个regexp。 这个标记:

{# comment %}

{# comment number 2$% %}

{% variable %}

{% array.key1.key2 %}

{% array.key1.key2|escape|bold %}

{% variable|escape %}

{% loop array as item %}
    My item is {% item.text %}
{% endloop %}

{% if (something): %}
    do something truly
{% else: %}
    nothing to do
{% endif; %}
为什么此regexp不适用于
{%item.text%}
而适用于其他? 我想我在这里犯了一些错误
[^else | endloop | endif]


我做错了什么?

我想你可能想:

/\{%\s((?!(else|endloop|endif))[a-z0-9\.\|_]+)\s%\}/si

先前包含
else
endloop
endif
关键字的方括号将每个字符视为例外。在这里,它们被视为整个字符串。

我想您可能打算:

/\{%\s((?!(else|endloop|endif))[a-z0-9\.\|_]+)\s%\}/si

先前包含
else
endloop
endif
关键字的方括号将每个字符视为例外。在这里,它们被视为整个字符串。

在我的正则表达式测试仪中,它是匹配的项目3到6。如果您使用“/\\{%\\s”([^else | endloop | endif][a-z0-9\\.\\\\\\\\\\\\\+)\\s%\\\\\\\\}/si'试试这个-并在我的正则表达式测试仪中将$replacement设置为$1,这是匹配的项目3到6。如果您使用“/\\{%\\s”([^else | endloop | endif][a-z0-9\\.\\\\\\\\\\\\\+)\\s%\\\\\\\}/si”,请尝试此操作,并将$replacement设置为$1