2

testというタグがあるとしましょう[code]

私がやりたいのは、文字列[code]内のすべてのメインタグ内に最大X個の他のタグのみを許可したい[code]ということです。つまり、最も内側のタグが削除されます。

したがって、たとえば、X = 4の場合、次の文字列は次のようになります。

[code]a[code]b[code]c[code]d[code]e[code]f[code]g[/code][/code][/code][/code][/code][/code][/code]

になります:

[code]a[code]b[code]c[code]d[code]e[/code][/code][/code][/code][/code]

そして次の文字列:

[code]a[code]b[code]c[code]d[code]TEST[/code][code]e[code]f[code]g[/code][/code][/code][/code][/code][/code][/code]

になります:

[code]a[code]b[code]c[code]d[code]TEST[/code][code]e[/code][/code][/code][/code][/code]

ここでの目標は、コード要素内にネストされた[code]要素が少なくないようにすることです。これにより、煩雑になりすぎないようになります。

アルゴリズムを考えてみて、これをどのように実装するのか疑問に思っています。提案をいただければ幸いです。

4

3 に答える 3

1

JBBCodeを使用できるようです。

http://jbbcode.com/docs#definingNewCodes

addBBCode's fifth and last parameter is a nest limit. By default 
the nest limit is -1, meaning no limit. Nest limits allow you to 
define a bbcode such that if the bbcode is embedded multiple times, 
elements nested beyond the nest limit will be omitted from the output. 
于 2012-05-29T20:32:04.607 に答える
1

ここで複数のタグのサポートなどを追加するのはとても簡単なので、これはかなり無駄になります。どちらの方法でも、完全に吹き飛ばされたツリー解析を行う必要があります。

無効な入力は一切処理されないことに注意してください。タグは適切にバランスを取る必要があります

function get_node_contents( $node ) {
    $orig = $node;
    $ret = "[code]" . $node->content;

    if( @$node->children ) {
        foreach( $node->children as $node ) {
            $ret .= get_node_contents( $node );
        }
    }


    if( @$orig->endContent ) {
        $ret .= $orig->endContent;
    }
    return $ret."[/code]";

}

function reduce_depth( $str, $maxDepth = 4 ) {
    $index = 0;
    $len = strlen( $str );
    $reg = '/(\[code\]|\[\/code\])/';

    $root = new stdClass;
    $root->children = array();
    $depth = 0;
    $ret = "";

    $pos = strpos( $str, "[code]" );

    if( $pos ) {
        $ret .= substr( $str, 0, $pos - 0);
    }

    while( $index < $len  ) {

        if( !preg_match( $reg, $str, $matches, PREG_OFFSET_CAPTURE, $index )) {
            break;
        }

        $index = ( $matches[1][1] + strlen( $matches[1][0] ) );
        $tag = $matches[1][0];

        $next = preg_match( $reg, $str, $matches, PREG_OFFSET_CAPTURE, $index );
        $content = "";

        if( $next ) {
            $content = substr( $str, $index, $matches[1][1] - $index );
        }

        if( $tag === "[code]" ) {
            if( $depth === 0 ) {
                $parent = $root->children[] = new stdClass;
                $parent->content = $content;
                $depth++;
            }
            else if ( $depth++ > $maxDepth ) {

                continue;
            }
            else {
                if( !@$parent->children ) {
                    $parent->children = array();
                }
                $child = $parent->children[] = new stdClass;
                $child->content = $content;
                $child->parent = $parent;
                $parent = $child;
            }        
        }
        else {                
            $depth--;

            if( @$parent->parent ) {
                $parent = $parent->parent;
            }

            if( @$content ) {
                $parent->endContent = $content;
            }                

        }

    }


    foreach( $root->children as $node ) {
        $ret .= get_node_contents( $node );
    }

    $ret .= substr( $str, $index, $len - $index );


    return $ret;

}

echo reduce_depth( "asdasdas[code]l[/code][code]a[code]lol[/code][code]b[code]c[code]d[code]e[code]f[code]g[/code][/code][/code][/code][/code][/code][/code]aasdasdsasd", 4 ). "\n";
echo reduce_depth( "[code]a[code]b[code]c[code]d[code]e[code]f[code]g[/code][/code][/code][/code][/code][/code][/code]", 4 ) . "\n";
echo reduce_depth( "[code]a[code]b[code]c[code]d[code]TEST[/code][code]e[code]f[code]g[/code][/code][/code][/code][/code][/code][/code]", 4 ) . "\n";
echo reduce_depth("[code][code]bugi[/code]bugi2[/code]", 1) . "\n"; 
echo reduce_depth("[code][code]bugi[/code]bugi2[code]bugi3[/code]bugi4[code]bugi5[/code]bugi6[/code]", 3) . "\n"; 


/*
    asdasdas[code]l[/code][code]a[code]lol[/code][code]b[code]c[code]d[code]e[/code][/code][/code][/code][/code]aasdasdsasd
    [code]a[code]b[code]c[code]d[code]e[/code][/code][/code][/code][/code]
    [code]a[code]b[code]c[code]d[code]TEST[/code][code]e[/code][/code][/code][/code][/code]
    [code][code]bugi[/code]bugi2[/code]
    [code][code]bugi[/code][code]bugi3[/code][code]bugi5[/code]bugi6[/code]

*/
于 2012-05-29T21:52:58.237 に答える
0

ここで何をするのかわかりませんが、これをHTMLとして出力する場合は、次のルールをスタイルシートに追加するだけです。

test test test test test { display: none; }

<test>明らかに、それはhtmlの一部ではないので、実際の要素である必要があります。

于 2012-05-29T20:25:03.617 に答える