PHP limit text string NOT including html tags?

后端 未结 5 2182
执笔经年
执笔经年 2021-01-05 03:34

Here\'s what\'s NOT working for me:

Jack and I love         


        
相关标签:
5条回答
  • 2021-01-05 04:14

    A function to truncate words in HTML code:

    //+ Jonas Raoni Soares Silva
    //@ http://jsfromhell.com
    function truncate($text, $length, $suffix = '…', $isHTML = true) {
        $i = 0;
        $simpleTags=array('br'=>true,'hr'=>true,'input'=>true,'image'=>true,'link'=>true,'meta'=>true);
        $tags = array();
        if($isHTML){
            preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
            foreach($m as $o){
                if($o[0][1] - $i >= $length)
                    break;
                $t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1);
                // test if the tag is unpaired, then we mustn't save them
                if($t[0] != '/' && (!isset($simpleTags[$t])))
                    $tags[] = $t;
                elseif(end($tags) == substr($t, 1))
                    array_pop($tags);
                $i += $o[1][1] - $o[0][1];
            }
        }
    
        // output without closing tags
        $output = substr($text, 0, $length = min(strlen($text),  $length + $i));
        // closing tags
        $output2 = (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : '');
    
        // Find last space or HTML tag (solving problem with last space in HTML tag eg. <span class="new">)
        $pos = (int)end(end(preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE)));
        // Append closing tags to output
        $output.=$output2;
    
        // Get everything until last space
        $one = substr($output, 0, $pos);
        // Get the rest
        $two = substr($output, $pos, (strlen($output) - $pos));
        // Extract all tags from the last bit
        preg_match_all('/<(.*?)>/s', $two, $tags);
        // Add suffix if needed
        if (strlen($text) > $length) { $one .= $suffix; }
        // Re-attach tags
        $output = $one . implode($tags[0]);
    
        //added to remove  unnecessary closure
        $output = str_replace('</!-->','',$output); 
    
        return $output;
    }
    

    Source: http://snippets.dzone.com/posts/show/7125

    0 讨论(0)
  • 2021-01-05 04:17

    Not easily - you could of course use strip_tags to de-htmlise the string, but other than that there's no easy fix.

    0 讨论(0)
  • 2021-01-05 04:19

    You could try this, worked for me if no tags are in string $differ will have a value of 0 giving $stringsize your original value of 100

      <?php
    $string = 'I have a dog and his name is <a href="http://www.jackismydog.com">Jack</a> and I love him very much because he\'s my favorite dog in the whole wide world and nothing could make me not love him, I think.';
    
    $stringall=strlen($string);
    $striphtml = strip_tags($string);
    $stringnohtml=strlen(striphtml);
    $differ=($stringall-$stringnohtml);
    $stringsize=($differ + 100);
    $limited = substr($string, 0, $stringsize).'...';
    echo $limited;
    ?>
    
    0 讨论(0)
  • 2021-01-05 04:37

    The easiest way would be to actually parse this into a DOM structure. You could use DOMDocument for that. Then you could simply go through the elements and make any changes to content.

    Another approach would be to do a two-pass regex search and replace - first use the regex to find contents of tags, then use the regex to replace the contents with shortened contents. This can be achieved with your usual preg_* functions.

    0 讨论(0)
  • 2021-01-05 04:39

    If you want to limit the text part, you need to parse it and check the limit yourself. The easiest way is to:

    if ( strlen(strip_tags($string)) > 100 )
    {
        // the url inside $url is too big
    }
    else
    {
        // the url inside $url fits
    }
    
    0 讨论(0)
提交回复
热议问题