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 :(! 我替换和关闭标签。[display=no_hide]问题是,它只是替换了 和 之间的所有内容[display=XXX][/display=XXX]但它应该在第一次遇到结束标签时停止。我怎样才能做到这一点?

(请注意,它XXX可以是一切,而不仅仅是hideor no_hide

提前致谢!

4

3 回答 3

1

你应该试试这个。它从display:someworddisplay=someword到下一个匹配的结束标记进行搜索。我使用“不情愿匹配”运算符*?来确保它不会从第一个打开标记转到最后一个关闭标记。

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

扩展greedybuddha的答案,如果你也想隐藏[display=no_hide]hides this[/display=no_hide],使用这个:

(\[display[=:][no_]*hide\].*?\[\/display[=:][no_]*hide\])

示例: http: //www.debuggex.com/embed/KRhwg3S-_8jnwQfG

于 2013-06-08T18:12:12.757 回答
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 回答