Viewing 2 replies - 1 through 2 (of 2 total)
  • Take a look at this StackOverflow thread. Basically the solution they use is:

    <?php
    /******************************************************************************
    * @Author: Richard Chonak
    * @Date:   August 6, 2013
    * @Description: Ensures closure of HTML tags opened in an automatically generated excerpt.
    * Also trims off any trailing incomplete HTML tag at the end of the excerpt.
    * @Tested: Up to WordPress version 3.6
    *
    * @Author: Boutros AbiChedid
    * @Date:   June 20, 2011
    * @Websites: https://bacsoftwareconsulting.com/ ; https://blueoliveonline.com/
    * @Description: Preserves HTML formating to the automatically generated Excerpt.
    * Also Code modifies the default excerpt_length and excerpt_more filters.
    * @Tested: Up to WordPress version 3.1.3
    *******************************************************************************/
    function custom_wp_trim_excerpt($text) {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        //Retrieve the post content.
        $text = get_the_content('');
    
        //Delete all shortcode tags from the content.
        $text = strip_shortcodes( $text );
    
        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
    
        $allowed_tags = '<img>,<small>,<strong>,<em>,<b>,<i>,<p>,<br>,<a>,<blockquote>,<ul>,<li>'; /*** MODIFY THIS. Add the allowed HTML tags separated by a comma.***/
        $twopart_tags = '<small>,<strong>,<em>,<b>,<i>,<p>,<br>,<a>,<blockquote>,<ul>,<li>'; /*** MODIFY THIS. Add the twopart HTML tags separated by a comma.***/
        /* turn tag list into one big search pattern */
        $search_patterns = "/" . str_replace(",","|",str_replace(">", "[^>]*>",$twopart_tags)) . '/';
    
        $text = strip_tags($text, $allowed_tags);
    
        $excerpt_word_count = 200; /*** MODIFY THIS. change the excerpt word count to any integer you like.***/
        $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 
    
        $excerpt_end = '[...]'; /*** MODIFY THIS. change the excerpt endind to something else.***/
        $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);
    
        $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
        if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
        } else {
            $text = implode(' ', $words);
        };
    
        /* if fragment ends in open tag, trim off */
        preg_replace ("/<[^>]*$/", "", $text);
    
        /* search for tags in excerpt */
        preg_match_all ($search_patterns, $text, $matches);
        /* if any tags found, check for matching pairs */
        $tagstack = array ("");
        $tagsfound = $matches[0];
        while ( count ($tagsfound) > 0) {
            $tagmatch = array_shift($tagsfound);
        /* if it's a closing tag, hooray; but if it's not, then look for the closer */
            if ( !strpos($tagmatch,"</") && !strpos ($tagmatch,"/>") ) {
          preg_match("/\pL+/",$tagmatch, $tagwords);
              $endtag = "</" . $tagwords[0] . ">";
              /* if this tag was not closed, put the closing tag on the stack */
              if (!in_array($endtag, $tagsfound) ) {
            array_push($tagstack,$endtag);
              };
            };
        };
    
        /* if any unbalanced tags were found, add the closing tags */
        while (count ($tagstack) > 1) {
        $text = $text . array_pop($tagstack);
        }
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
    }
    remove_filter('get_the_excerpt', 'wp_trim_excerpt');
    add_filter('get_the_excerpt', 'custom_wp_trim_excerpt');
    ?>

    Sorry for the length…

    Thread Starter coriander

    (@coriander)

    Thanks Evan,

    looks like this is for the automatically generated excerpt though…
    I tried something similar already and realized it wasn’t being applied to my manual excerpts.

Viewing 2 replies - 1 through 2 (of 2 total)
  • The topic ‘manual excerpt stripping HTML tags’ is closed to new replies.