我发现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;标签
答案 0 :(得分:1)
问题是你错过了正确的模式修饰符。
在这种情况下,您应该使用/s
修饰符,例如:
/your pattern/s
/s
修饰符会更改点.
与字符匹配的方式;默认情况下,它匹配除了换行符之外的所有内容,但是/s
它真正匹配任何内容。
顺便说一句,您可能还想使用/U
修饰符默认情况下使表达式(.*)
非贪婪;贪婪模式会尽可能地匹配,如果你使用它们可能会得到意想不到的结果。
多个模式修饰符的指定如下:
/your pattern/sU
顺便说一句,您也可以使用/U
代替(.*?)
修饰符来指定非贪婪匹配。