如何清除重复的 BB 标签
How to clean duplicate BB tags
[i][b][i][b](This is a paragraph with BBcode.)[/b][/i][/b][/i]
我的一些 BB 代码有双标签,删除它的最佳方法是什么?
我尝试了一些主要是正则表达式的东西,但老实说,我是正则表达式的新手。
您可以尝试使用正则表达式(可能像 /\[.*\]/U
)提取所有标签,然后遍历它们,删除所有重复项
快速示例:
$bb = '[i][b][i][b](This is a paragraph with BBcode.)[/b][/i][/b][/i]';
preg_match_all('/(\[.*\])/gU', $bb, $tags);
$metTags = [];
foreach($tags[0] as $tag) {
// tag has not been met, save it
if (in_array($tag, $metTags) === false) {
$metTags[] = $tag;
// tag have been met already
} else {
// remove it ONCE
$bb = preg_replace('#'.preg_quote($tag).'#', '', $bb, 1);
}
}
echo $bb;
由于 preg_replace() 的使用,这可能不是最佳解决方案,但仍然做得很好。
编辑:添加代码
所以我只在 php 中写了一个冗长的方法。它基本上遍历所有字符,然后当我找到一个“[”时,我检查其余的是否接受了标签。我最终得到了所有样式的数组,只有文本允许我删除重复的样式。会显示代码但不想被嘲笑 :D
这绝对是可怕的,但它确实有效。
<?php
$bb = '[i][b][i][b](This is a paragraph with BBcode.)[/b][/i][/b][/i]';
// regex with start, paragraph, and end capture groups
$regex = '#(?<start>(\[[a-z]*\])*+)(?<paragraph>.*)(?<end>(\[\/[a-z]*\])*+)#U';
// put matches into $matches array
preg_match_all($regex, $bb, $matches);
// get the stuff we need
$start = $matches['start'][0]; // string(12) "[i][b][i][b]"
$paragraph = implode('', $matches['paragraph']);
// now we will grab each tag
$regex = '#\[(?<tag>[a-z])\]#';
preg_match_all($regex, $start, $matches);
$tags = array_unique($matches['tag']);
// and build up the new string
$newString = '';
foreach($tags as $tag) {
$newString .= '[' . $tag . ']';
}
// create the end tags
$end = str_replace('[', '[/', $newString);
// put it all together
$newString .= $paragraph . $end;
echo $newString; // [i][b](This is a paragraph with BBcode.)[/i][/b]
这给了你 [i][b](This is a paragraph with BBcode.)[/i][/b]
[i][b][i][b](This is a paragraph with BBcode.)[/b][/i][/b][/i]
我的一些 BB 代码有双标签,删除它的最佳方法是什么?
我尝试了一些主要是正则表达式的东西,但老实说,我是正则表达式的新手。
您可以尝试使用正则表达式(可能像 /\[.*\]/U
)提取所有标签,然后遍历它们,删除所有重复项
快速示例:
$bb = '[i][b][i][b](This is a paragraph with BBcode.)[/b][/i][/b][/i]';
preg_match_all('/(\[.*\])/gU', $bb, $tags);
$metTags = [];
foreach($tags[0] as $tag) {
// tag has not been met, save it
if (in_array($tag, $metTags) === false) {
$metTags[] = $tag;
// tag have been met already
} else {
// remove it ONCE
$bb = preg_replace('#'.preg_quote($tag).'#', '', $bb, 1);
}
}
echo $bb;
由于 preg_replace() 的使用,这可能不是最佳解决方案,但仍然做得很好。
编辑:添加代码
所以我只在 php 中写了一个冗长的方法。它基本上遍历所有字符,然后当我找到一个“[”时,我检查其余的是否接受了标签。我最终得到了所有样式的数组,只有文本允许我删除重复的样式。会显示代码但不想被嘲笑 :D
这绝对是可怕的,但它确实有效。
<?php
$bb = '[i][b][i][b](This is a paragraph with BBcode.)[/b][/i][/b][/i]';
// regex with start, paragraph, and end capture groups
$regex = '#(?<start>(\[[a-z]*\])*+)(?<paragraph>.*)(?<end>(\[\/[a-z]*\])*+)#U';
// put matches into $matches array
preg_match_all($regex, $bb, $matches);
// get the stuff we need
$start = $matches['start'][0]; // string(12) "[i][b][i][b]"
$paragraph = implode('', $matches['paragraph']);
// now we will grab each tag
$regex = '#\[(?<tag>[a-z])\]#';
preg_match_all($regex, $start, $matches);
$tags = array_unique($matches['tag']);
// and build up the new string
$newString = '';
foreach($tags as $tag) {
$newString .= '[' . $tag . ']';
}
// create the end tags
$end = str_replace('[', '[/', $newString);
// put it all together
$newString .= $paragraph . $end;
echo $newString; // [i][b](This is a paragraph with BBcode.)[/i][/b]
这给了你 [i][b](This is a paragraph with BBcode.)[/i][/b]