1

我发现 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 }}';

所以我想问题出在换行符上,而不是 <br /> 标签

4

1 回答 1

1

问题是您缺少正确的模式修饰符。

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

/your pattern/s

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

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

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

/your pattern/sU

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

于 2012-11-19T15:06:44.450 回答