我希望能够从字符串中删除所有BBCode,除了[quote] BBCode。
我有以下可能引用的模式:
[quote="User"]
[quote=User]
[quote]
Text
[/quote]
[/quote]
[/quote]
这是我目前用来剥离有效的BBCode:
$pattern = '|[[\/\!]*?[^\[\]]*?]|si';
$replace = '';
$quote = preg_replace($pattern, $replace, $tag->content);
答案 0 :(得分:2)
几乎是一些解决方案
<?php
function show($s) {
static $i = 0;
echo "<pre>************** Option $i ******************* \n" . $s . "</pre>";
$i++;
}
$string = 'A [b]famous group[/b] once sang:
[quote]Hey you,[/quote]
[quote mlqksmkmd]No you don\'t have to go[/quote]
See [url
http://www.dailymotion.com/video/x9e7ez_pony-pony-run-run-hey-you-official_music]this video[/url] for more.';
// Option 0
show($string);
// Option 1: This will strip all BBcode without ungreedy mode
show(preg_replace('#\[[^]]*\]#', '', $string));
// Option 2: This will strip all BBcode with ungreedy mode (Notice the #U at the end of the regex)
show(preg_replace('#\[.*\]#U', '', $string));
// Option 3: This will replace all BBcode except [quote] without Ungreedy mode
show(preg_replace('#\[((?!quote)[^]])*\]#', '', $string));
// Option 4: This will replace all BBcode except [quote] with Ungreedy mode
show(preg_replace('#\[((?!quote).)*\]#U', '', $string));
// Option 5: This will replace all BBcode except [quote] with Ungreedy mode and mutiple lines wrapping
show(preg_replace('#\[((?!quote).)*\]#sU', '', $string));
?>
实际上,我认为这只是选项3和5之间的选择。
[^]]
选择不是]
的每个字符。它允许“模仿”不合理的模式。U
正则表达式选项允许我们使用.*
代替[^]]*
s
正则表达式选项允许匹配多行(?!quote)
允许我们在下一个选择中说出任何与“引用”不匹配的内容。
它以这种方式使用:((?!quote).)*
。有关详细信息,请参阅Regular expression to match a line that doesn't contain a word?。This fiddle是一个现场演示。