Php 一种去除不完整bbcode的方法?

Php 一种去除不完整bbcode的方法?,php,regex,Php,Regex,在php中有没有一种方法可以搜索像[b][/b]这样的BBCode 例如,他们没有结束标记的地方?比如说,在电子邮件订阅中显示文本回复片段,减少到x个字符可能会关闭BB code而不打开它 与PHP一起使用。您可以使用bbcode字符串。它相当复杂,但您可以实现naive算法来提供语法分析。通过这种方式,您可以获得所有错误,如未关闭的标记或标记关闭顺序错误,例如: [b] [i] [/b] [/i] 最简单的方法是: 准备标签列表([b]、[i]等) 搜索第一个标记并将其添

在php中有没有一种方法可以搜索像
[b][/b]
这样的BBCode

例如,他们没有结束标记的地方?比如说,在电子邮件订阅中显示文本回复片段,减少到
x个字符
可能会关闭
BB code
而不打开它

与PHP一起使用。

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

[b] 
    [i] 
    [/b]
[/i]
最简单的方法是:

  • 准备标签列表(
    [b]、[i]等
  • 搜索第一个标记并将其添加到堆栈中
  • 继续查找,如果有更多的开始标记,也将它们推到堆栈上
  • 找到结束标记后,检查堆栈顶部的内容。应该有正确的开头标签。如果没有,那么你会找到你想要的。若结束标记合适,那个么可以弹出最后一个元素并继续解析
  • 您可以对字符串进行编码。它相当复杂,但您可以实现naive算法来提供语法分析。通过这种方式,您可以获得所有错误,如未关闭的标记或标记关闭顺序错误,例如:

    [b] 
        [i] 
        [/b]
    [/i]
    
    最简单的方法是:

  • 准备标签列表(
    [b]、[i]等
  • 搜索第一个标记并将其添加到堆栈中
  • 继续查找,如果有更多的开始标记,也将它们推到堆栈上
  • 找到结束标记后,检查堆栈顶部的内容。应该有正确的开头标签。如果没有,那么你会找到你想要的。若结束标记合适,那个么可以弹出最后一个元素并继续解析

  • 我写了一个函数,它会告诉你字符串中是否有一些未关闭的bb标记。虽然它不能告诉位置,但它能告诉哪些标签有错误,所以更容易找到它们。它还可以找到复杂的bb标记,如[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标记。虽然它不能告诉位置,但它能告诉哪些标签有错误,所以更容易找到它们。它还可以找到复杂的bb标记,如[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上发现了一个有用的脚本,它有一种不同的方法在前端工作,并通过突出显示来直观地显示不正确的标记


    这根本不容易-考虑这个代码,例如:<代码>我的文本[b]粗体文本[b]更大胆的文本[/b] < /代码>。什么应该是粗体文本,什么不应该?如果我的文本[B]粗体文本[B]更大胆的文本[/B] [/B] < /代码>,我的文本[B]粗体文本[/B] [B]更大胆的文本[/B] < /代码>或<代码>我的文本粗体文本[B]更大胆的文本[/B] < /代码> -这不容易——考虑这个代码例如:<代码>我的文本[B]粗体文本[B]更大胆的文本[/B] < /代码>。什么应该是粗体文本,什么不应该?应该是
    我的文本[b]加粗文本[b]加粗文本[/b][b]
    我的文本[b]加粗文本[/b][b]加粗文本[/b]
    还是
    我的文本加粗文本[b]加粗文本[/b]