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() は、「英語」、「ドイツ語」、または「インドネシア」のいずれかを返します

このような文字列を $value に割り当てると、$language の値に応じて、"Victoria"、"Hitler"、または "Sule" のいずれかが返されます。

$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 に答える