PHP substr but keep HTML tags?

后端 未结 3 889
不知归路
不知归路 2020-12-28 17:19

I am wondering if there is an elegant way to trim some text but while being HTML tag aware?

For example, I have this string:

$data = \'         


        
相关标签:
3条回答
  • 2020-12-28 17:49

    A few mounths ago I created a special function which is solution for your problem.

    Here is a function:

    function substr_close_tags($code, $limit = 300)
    {
        if ( strlen($code) <= $limit )
        {
            return $code;
        }
    
        $html = substr($code, 0, $limit);
        preg_match_all ( "#<([a-zA-Z]+)#", $html, $result );
    
        foreach($result[1] AS $key => $value)
        {
            if ( strtolower($value) == 'br' )
            {
                unset($result[1][$key]);
            }
        }
        $openedtags = $result[1];
    
        preg_match_all ( "#</([a-zA-Z]+)>#iU", $html, $result );
        $closedtags = $result[1];
    
        foreach($closedtags AS $key => $value)
        {
            if ( ($k = array_search($value, $openedtags)) === FALSE )
            {
                continue;
            }
            else
            {
                unset($openedtags[$k]);
            }
        }
    
        if ( empty($openedtags) )
        {
            if ( strpos($code, ' ', $limit) == $limit )
            {
                return $html."...";
            }
            else
            {
                return substr($code, 0, strpos($code, ' ', $limit))."...";
            }
        }
    
        $position = 0;
        $close_tag = '';
        foreach($openedtags AS $key => $value)
        {   
            $p = strpos($code, ('</'.$value.'>'), $limit);
    
            if ( $p === FALSE )
            {
                $code .= ('</'.$value.'>');
            }
            else if ( $p > $position )
            {
                $close_tag = '</'.$value.'>';
                $position = $p;
            }
        }
    
        if ( $position == 0 )
        {
            return $code;
        }
    
        return substr($code, 0, $position).$close_tag."...";
    }
    

    Here is DEMO: http://sandbox.onlinephpfunctions.com/code/899d8137c15596a8528c871543eb005984ec0201 (click "Execute code" to check how it works).

    0 讨论(0)
  • 2020-12-28 17:56

    substr(strip_tags($content), 0, 100)

    0 讨论(0)
  • 2020-12-28 18:09

    Using @newbieuser his function, I had the same issue, like @pablo-pazos, that it was (not) breaking when $limit fell into an html tag (in my case <br /> at the r)

    Fixed with some code

    if ( strlen($code) <= $limit ){
        return $code;
    }
    
    $html = substr($code, 0, $limit);       
    
    //We must find a . or > or space so we are sure not being in a html-tag!
    //In my case there are only <br>
    //If you have more tags, or html formatted text, you must do a little more and also use something like http://htmlpurifier.org/demo.php
    
    $_find_last_char = strrpos($html, ".")+1;
    if($_find_last_char > $limit/3*2){
        $html_break = $_find_last_char;
    }else{
        $_find_last_char = strrpos($html, ">")+1;
        if($_find_last_char > $limit/3*2){ 
            $html_break = $_find_last_char;
        }else{
            $html_break = strrpos($html, " ");
        }
    }
    
    $html = substr($html, 0, $html_break);
    preg_match_all ( "#<([a-zA-Z]+)#", $html, $result );
    ......
    
    0 讨论(0)
提交回复
热议问题