1

有没有办法在 php 中搜索 bbcode 之类的[b][/b].

例如,他们没有结束标签?说在电子邮件订阅中显示文本回复的片段被削减到x characters可能会被切断BB-Code而使其保持打开状态?

与 PHP 一起使用。

4

2 回答 2

1

您可以解析bbcode 字符串。它相当复杂,但您可以实现简单的算法来提供句法分析。通过这种方式,您可以获得所有错误,例如未关闭的标签或标签关闭中的错误顺序,例如:

[b] 
    [i] 
    [/b]
[/i]

最简单的方法:

  1. 准备标签列表 ( [b], [i] etc)
  2. 搜索第一个标签并将其添加到堆栈中
  3. 继续寻找,如果有更多的开始标签,也将它们推入堆栈。
  4. 当你找到结束标签时,检查堆栈顶部的内容。应该有正确的开始标签。如果没有,那么你会找到你要找的东西。如果结束标记适合,那么您可以弹出最后一个元素并继续解析。
于 2013-01-18T12:16:45.950 回答
0

我写了一个函数,它会告诉你字符串中是否有一些未闭合的 bb-tags。虽然它不能告诉位置,但它会告诉哪些标签有错误,因此更容易找到它们。它还可以找到复杂的 bb-tags,例如 [url=something]urlname[/url]

<?PHP
$test_string = "
    [b]bold ok[/b]
    [b]bold unclosed[b]
    [i]italic unclsed[i]
    [i]italic[/i]
";

echo checkBBCode($test_string);

//------------------------------------

function checkBBCode($str)
{
    $result = "";

    $taglist = array("b", "i", "u", "h1", "h2", "url"); //the bb-tags to search for
    $result_array = array();

    foreach($taglist as $tag )
    {
        // How often is the open tag?  
        preg_match_all ('/\['.$tag.'(=[^ ]+)?\]/i', $str, $matches);  
        $opentags = count($matches['0']);  

        // How often is the close tag?  
        preg_match_all ('/\[\/'.$tag.'\]/i', $str, $matches);  
        $closetags = count($matches['0']);  

        // how many tags have been unclosed? 
        $unclosed = $opentags - $closetags;  
        $unclosed = (int)$unclosed*-1; //force positive values


        $result_array[] = $tag." :".$unclosed;
    }

    foreach($result_array as $check)
    {
        $result .= "\n\r<br>".$check;
    }
    return $result;
}


?> 

我在 dreamincode.net 上发现了一个有用的脚本,它在前端有不同的工作方式,并通过突出显示不正确的标签来直观地显示它们。

bb_check 现场演示

bb_check 全文

于 2013-05-21T19:30:22.107 回答