0

一部のコンテンツの終了タグまで、特定のタグを非表示にしたいのですが、適切に機能させることができません。
これは私が持っているものです:

$fnc_patterns   =   "/\[display=[^!]+\]?.*\[\/display=[^!]+\]/";
$str           =    preg_replace($fnc_patterns, '', $str);

$str = "Dummy text text dummy [display=hide]hide this[/display=hide] but it also [display=no_hide]hides this[/display=no_hide] and not [display=hide]this[/display=hide] :(!";
//Outputs: Dummy text text dummy :(!

ただし、この関数の前にDummy text text dummy but it also hides this :(! I replaceと close tagを出力する必要があります。問題は、 and[display=no_hide]の間のすべてを単純に置き換えることですが、最初の終了タグの出現で停止する必要があります。どうやってやるの?[display=XXX][/display=XXX]

(またはXXXだけでなく、すべてになる可能性があることに注意してください)hideno_hide

前もって感謝します!

4

3 に答える 3

1

これを試してみてください。次の一致する終了タグから、display:somewordまたは終了タグまで検索します。display=someword「消極的な一致」演算子*?を使用して、最初の開始タグから最後の終了タグに移動しないようにします。

$fnc_patterns   =   "/(\[display[=:]([^\]]+)\].*?\[\/display[=:]\2\])/"
于 2013-06-08T17:47:36.227 に答える
0

非表示にするタグを簡単に選択したい場合は、DEFINE構文を使用できます。このパターンは、ネストされたタグを処理できます。

$str = <<<LOD
Shw1 [display=marmot]Hid1[/display=marmot]Shw2
[display=nutria]Hid2[display=badger]Hid3[/display=badger]Hid4[/display=nutria]
[display=marmot]Hid5[display=marmot]Hid6[/display=marmot]Hid7[/display=marmot]
Shw3 [display=weasel]Shw4[/display=weasel]
LOD;

$pattern = <<<'LOD'
~
    # definitions
    (?(DEFINE)(?<terms>(?>nutria|marmot|badger)))

    # pattern
    \[display([=:]\g<terms>)]
        (?>[^][]++|(?R)?)+
    \[/display\2]
~x
LOD;

echo preg_replace ($pattern, '', $str);

DEFINE構文を使用せずに同じことができることに注意してください。

$hidden_tags = array('nutria', 'marmot', 'badger');
$terms = implode('|', $hidden_tags);
$pattern = '~\[display([=:](?>'.$terms.')](?>[^][]++|(?R)?)+\[/display\1]~';
于 2013-06-08T18:42:09.540 に答える