Switch language

wpseek.com
A WordPress-centric search engine for devs and theme authors




force_balance_tags [ WordPress Function ]

force_balance_tags ( $text )
Parameters:
  • (string) $text Text to be balanced.
Returns:
  • (string) Balanced text.
Defined at:



Balances tags of string using a modified stack.

Source


<?php
function force_balance_tags$text ) {
    
$tagstack = array();
    
$stacksize 0;
    
$tagqueue '';
    
$newtext '';
    
$single_tags = array( 'br''hr''img''input' ); // Known single-entity/self-closing tags
    
$nestable_tags = array( 'blockquote''div''span''q' ); // Tags that can be immediately nested within themselves

    // WP bug fix for comments - in case you REALLY meant to type '< !--'
    
$text str_replace('< !--''<    !--'$text);
    
// WP bug fix for LOVE <3 (and other situations with '<' before a number)
    
$text preg_replace('#<([0-9]{1})#''&lt;$1'$text);

    while ( 
preg_match("/<(\/?[\w:]*)\s*([^>]*)>/"$text$regex) ) {
        
$newtext .= $tagqueue;

        
$i strpos($text$regex[0]);
        
$l strlen($regex[0]);

        
// clear the shifter
        
$tagqueue '';
        
// Pop or Push
        
if ( isset($regex[1][0]) && '/' == $regex[1][0] ) { // End Tag
            
$tag strtolower(substr($regex[1],1));
            
// if too many closing tags
            
if( $stacksize <= ) {
                
$tag '';
                
// or close to be safe $tag = '/' . $tag;
            
}
            
// if stacktop value = tag close value then pop
            
else if ( $tagstack[$stacksize 1] == $tag ) { // found closing tag
                
$tag '</' $tag '>'// Close Tag
                // Pop
                
array_pop$tagstack );
                
$stacksize--;
            } else { 
// closing tag not at top, search for it
                
for ( $j $stacksize-1$j >= 0$j-- ) {
                    if ( 
$tagstack[$j] == $tag ) {
                    
// add tag to tagqueue
                        
for ( $k $stacksize-1$k >= $j$k--) {
                            
$tagqueue .= '</' array_pop$tagstack ) . '>';
                            
$stacksize--;
                        }
                        break;
                    }
                }
                
$tag '';
            }
        } else { 
// Begin Tag
            
$tag strtolower($regex[1]);

            
// Tag Cleaning

            // If self-closing or '', don't do anything.
            
if ( substr($regex[2],-1) == '/' || $tag == '' ) {
                
// do nothing
            
}
            
// ElseIf it's a known single-entity tag but it doesn't close itself, do so
            
elseif ( in_array($tag$single_tags) ) {
                
$regex[2] .= '/';
            } else {    
// Push the tag onto the stack
                // If the top of the stack is the same as the tag we want to push, close previous tag
                
if ( $stacksize && !in_array($tag$nestable_tags) && $tagstack[$stacksize 1] == $tag ) {
                    
$tagqueue '</' array_pop ($tagstack) . '>';
                    
$stacksize--;
                }
                
$stacksize array_push ($tagstack$tag);
            }

            
// Attributes
            
$attributes $regex[2];
            if( !empty(
$attributes) )
                
$attributes ' '.$attributes;

            
$tag '<' $tag $attributes '>';
            
//If already queuing a close tag, then put this tag on, too
            
if ( !empty($tagqueue) ) {
                
$tagqueue .= $tag;
                
$tag '';
            }
        }
        
$newtext .= substr($text0$i) . $tag;
        
$text substr($text$i $l);
    }

    
// Clear Tag Queue
    
$newtext .= $tagqueue;

    
// Add Remaining text
    
$newtext .= $text;

    
// Empty Stack
    
while( $x array_pop($tagstack) )
        
$newtext .= '</' $x '>'// Add remaining tags to close

    // WP fix for the bug with HTML comments
    
$newtext str_replace("< !--","<!--",$newtext);
    
$newtext str_replace("<    !--","< !--",$newtext);

    return 
$newtext;
}
?>

Examples [ wp-snippets.com ]

Google Arama Sonuçlarý

Dahasý ...

Kullanýcý Tartýþmalarý [ wordpress.org ]

- Bulunamadý -

Yeni bir konu yaz ...

0 User Note(s)

Henüz yok. Ýlk sen ol!

Yeni Ekle ...



HTML5 Powered with CSS3 / Styling, Performance & Integration, and Semantics