php preg_replace不适用于HTML标记

时间:2012-11-19 14:21:49

标签: php regex preg-replace

我发现php preg_replace无法使用HTML标记。

假设我有这样的代码:

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

$ this-> cms_language()将返回“english”,“german”或“indonesia”中的一个

当我将这样的字符串分配给$ value时,它会给出“Victoria”,“Hitler”或“Sule”取决于$ language的值:

$value = '{{ if_language:english }}Victoria{{ elif_language:german }}Hitler{{ else }}Sule{{ end_if }}</p>'

但是当我将$ value更改为

时,它将无效
$value = '{{ if_language:english }}<br />
Victoria<br />
{{ elif_language:german }}<br />
Hitler<br />
{{ else }}<br />
Sule<br />
{{ end_if }}</p>'

将把$ value作为输出。

那么这里有什么问题?

编辑:抱歉,我发现这个有效:

$value = '{{ if_language:english }}<br />Victoria<br />{{ elif_language:german }}<br /> Hitler<br />{{ else }}<br />Sule<br />{{ end_if }}';

所以我猜问题是新行字符,而不是&lt; br /&gt;标签

1 个答案:

答案 0 :(得分:1)

问题是你错过了正确的模式修饰符。

在这种情况下,您应该使用/s修饰符,例如:

/your pattern/s

/s修饰符会更改点.与字符匹配的方式;默认情况下,它匹配除了换行符之外的所有内容,但是/s它真正匹配任何内容。

顺便说一句,您可能还想使用/U修饰符默认情况下使表达式(.*)非贪婪;贪婪模式会尽可能地匹配,如果你使用它们可能会得到意想不到的结果。

多个模式修饰符的指定如下:

/your pattern/sU

顺便说一句,您也可以使用/U代替(.*?)修饰符来指定非贪婪匹配。