如何清除重复的BB标签

时间:2019-07-31 14:06:59

标签: php regex bbcode

[i][b][i][b](This is a paragraph with BBcode.)[/b][/i][/b][/i]

我的某些BB代码具有双标签,删除此标签的最佳方法是什么?

我已经尝试了一些正则表达式,但是说实话,我是一个新手。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用正则表达式(例如/\[.*\]/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(),这可能不是最好的解决方案,但仍然做得很好。

编辑:添加代码

答案 1 :(得分:1)

这绝对是可怕的,但是有效。

<?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]

在这里https://3v4l.org/O8UHO

检查

答案 2 :(得分:0)

所以我只在php中写了一个冗长的方法。它基本上遍历所有字符,然后当我找到“ [”时,我检查其余字符是否接受了标签。我最终得到了所有样式的数组,并且只有文本允许我删除重复的样式。会显示代码,但不想被:D

嘲笑