php preg_replace替换不在输入值中的所有内容

时间:2012-11-20 10:11:51

标签: php regex preg-replace

我有一个模板系统来显示基于$this->cms_language()值的内容。 在这种情况下,$value将替换为与正则表达式匹配的内容。 它的工作方式与http://www.getnocms.com/2012/11/better-multi-language-template-better.html

相同
    $language = $this->cms_language();
    $pattern = array();
    $pattern[] = "/\{\{ if_language:$language \}\}(.*?)\{\{ elif_language:.*?\{\{ end_if }}/s";
    $pattern[] = "/\{\{ if_language:$language \}\}(.*?)\{\{ else \}\}.*?\{\{ end_if }}/s";
    $pattern[] = "/\{\{ if_language:$language \}\}(.*?)\{\{ end_if }}/s";
    $pattern[] = "/\{\{ if_language:.*?\{\{ elif_language:$language \}\}(.*?)\{\{ elif_language:.*?\{\{ end_if }}/s";
    $pattern[] = "/\{\{ if_language:.*?\{\{ elif_language:$language \}\}(.*?)\{\{ else \}\}.*?\{\{ end_if }}/s";
    $pattern[] = "/\{\{ if_language:.*?\{\{ elif_language:$language \}\}(.*?)\{\{ end_if }}/s";
    $pattern[] = "/\{\{ if_language:.*?\{\{ else \}\}(.*?)\{\{ end_if }}/s"; 
    $replacement = '$1';
    $value = preg_replace($pattern, $replacement, $value);

到目前为止一切都很好。但后来,我发现了一个问题。例如,我编写一个文本区域或包含任何这些模式的输入。类似的东西:

$value = '<input value="{{ if_language:indonesia }} do_something {{ end_if }}" />';

我不希望输入值被替换,即使它与正则表达式匹配。 由于我在这里使用了很多模式,如何避免这种情况最有效?

1 个答案:

答案 0 :(得分:1)

您可以尝试添加

foreach ($pattern as &$p) {
  $p = preg_replace("/^\//", "/(?![^<>]*>|(?:[^>]*<\/(?:[tT][eE][xX][tT][aA][rR][eE][aA]|[sS][eE][lL][eE][cC][tT])[^<>]*>))", $p);

}}

在现有preg_replace之前

,以避免在大多数情况下这样做。

请参阅 this demo