Php 在WordPress插件中的截断字符串末尾添加省略号

Php 在WordPress插件中的截断字符串末尾添加省略号,php,wordpress,Php,Wordpress,我试图在这个php函数生成的截断字符串的末尾添加一个省略号。它是Wordpress插件的一部分。但是,唉,我只是在学习php 我试着在函数末尾附近的结束html标记之前打印省略号,如下所示 $truncate.='…' 但是没有运气。有什么想法吗?它必须相当直截了当 以下是整个功能: if( !function_exists( 'yd_cake_truncate' ) ) { function yd_cake_truncate($text, $length = 100, $ending

我试图在这个php函数生成的截断字符串的末尾添加一个省略号。它是Wordpress插件的一部分。但是,唉,我只是在学习php

我试着在函数末尾附近的结束html标记之前打印省略号,如下所示

$truncate.='…'

但是没有运气。有什么想法吗?它必须相当直截了当

以下是整个功能:

if( !function_exists( 'yd_cake_truncate' ) ) {
    function yd_cake_truncate($text, $length = 100, $ending = '...', $exact = true, $considerHtml = false) {
        if ($considerHtml) {
            // if the plain text is shorter than the maximum length, return the whole text
            if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
                return $text;
            }

            // splits all html-tags to scanable lines
            preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);

            $total_length = strlen($ending);
            $open_tags = array();
            $truncate = '';

            foreach ($lines as $line_matchings) {
                // if there is any html-tag in this line, handle it and add it (uncounted) to the output
                if (!empty($line_matchings[1])) {
                    // if it's an "empty element" with or without xhtml-conform closing slash (f.e. <br/>)
                    if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
                        // do nothing
                        // if tag is a closing tag (f.e. </b>)
                    } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
                        // delete tag from $open_tags list
                        $pos = array_search($tag_matchings[1], $open_tags);
                        if ($pos !== false) {
                            unset($open_tags[$pos]);
                        }
                        // if tag is an opening tag (f.e. <b>)
                    } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
                        // add tag to the beginning of $open_tags list
                        array_unshift($open_tags, strtolower($tag_matchings[1]));
                    }
                    // add html-tag to $truncate'd text
                    $truncate .= $line_matchings[1];
                }

                // calculate the length of the plain text part of the line; handle entities as one character
                $content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
                if ($total_length+$content_length> $length) {
                    // the number of characters which are left
                    $left = $length - $total_length;
                    $entities_length = 0;
                    // search for html entities
                    if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
                        // calculate the real length of all entities in the legal range
                        foreach ($entities[0] as $entity) {
                            if ($entity[1]+1-$entities_length <= $left) {
                                $left--;
                                $entities_length += strlen($entity[0]);
                            } else {
                                // no more characters left
                                break;
                            }
                        }
                    }
                    $truncate .= substr($line_matchings[2], 0, $left+$entities_length);
                    // maximum lenght is reached, so get off the loop
                    break;
                } else {
                    $truncate .= $line_matchings[2];
                    $total_length += $content_length;
                }

                // if the maximum length is reached, get off the loop
                if($total_length>= $length) {
                    break;
                }
            }
        } else {
            if (strlen($text) <= $length) {
                return $text;
            } else {
                $truncate = substr($text, 0, $length - strlen($ending));
            }
        }

        // if the words shouldn't be cut in the middle...
        if (!$exact) {
            // ...search the last occurance of a space...
            $spacepos = strrpos($truncate, ' ');
            if (isset($spacepos)) {
                // ...and cut the text in this position
                $truncate = substr($truncate, 0, $spacepos);
            }
        }

        // add the defined ending to the text
        $truncate .= $ending;

        if($considerHtml) {
            // close all unclosed html-tags
            foreach ($open_tags as $tag) {
                    $truncate .= '</' . $tag . '>';
            }
        }

        return $truncate;

    } 
}
    // add the defined ending to the text
    $truncate .= $ending;
如果(!function_存在('yd_cake_truncate')){
函数yd_cake_truncate($text,$length=100,$ending='…',$exact=true,$considerHtml=false){
如果($considerHtml){
//如果纯文本短于最大长度,则返回整个文本
if(strlen(preg_replace('/','$text))$/s',$line_matchings[1],$tag_matchings)){
//将标记添加到$open_标记列表的开头
数组_unshift($open_标记,strtolower($tag_匹配[1]));
}
//将html标记添加到$truncate'd文本
$truncate.=$line_匹配[1];
}
//计算行的纯文本部分的长度;将实体作为一个字符处理
$content_length=strlen(preg_replace('/&[0-9a-z]{2,8};|&[0-9]{1,7};| x[0-9a-f]{1,6};/i','.$line_匹配[2]);
如果($total_length+$content_length>$length){
//剩余的字符数
$left=$length-$total_length;
$entities_length=0;
//搜索html实体
如果(preg_match_all('/&[0-9a-z]{2,8};|和#[0-9]{1,7};|和#x[0-9a-f]{1,6};/i',$line_matchings[2],$entities,preg_OFFSET_CAPTURE)){
//计算合法范围内所有实体的实际长度
foreach($entities[0]作为$entity){
如果($entity[1]+1-$entities\u length=$length){
打破
}
}
}否则{

如果(strlen($text)函数签名看起来像是默认情况下使用
$end
参数将省略号添加到截断字符串的末尾:

yd\u cake\u truncate($text,$length=100,$ending='…',$exact=true,$considerHtml=false)

进一步往下看,
$ending
附加到函数末尾附近的截断字符串:

if( !function_exists( 'yd_cake_truncate' ) ) {
    function yd_cake_truncate($text, $length = 100, $ending = '...', $exact = true, $considerHtml = false) {
        if ($considerHtml) {
            // if the plain text is shorter than the maximum length, return the whole text
            if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
                return $text;
            }

            // splits all html-tags to scanable lines
            preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);

            $total_length = strlen($ending);
            $open_tags = array();
            $truncate = '';

            foreach ($lines as $line_matchings) {
                // if there is any html-tag in this line, handle it and add it (uncounted) to the output
                if (!empty($line_matchings[1])) {
                    // if it's an "empty element" with or without xhtml-conform closing slash (f.e. <br/>)
                    if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
                        // do nothing
                        // if tag is a closing tag (f.e. </b>)
                    } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
                        // delete tag from $open_tags list
                        $pos = array_search($tag_matchings[1], $open_tags);
                        if ($pos !== false) {
                            unset($open_tags[$pos]);
                        }
                        // if tag is an opening tag (f.e. <b>)
                    } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
                        // add tag to the beginning of $open_tags list
                        array_unshift($open_tags, strtolower($tag_matchings[1]));
                    }
                    // add html-tag to $truncate'd text
                    $truncate .= $line_matchings[1];
                }

                // calculate the length of the plain text part of the line; handle entities as one character
                $content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
                if ($total_length+$content_length> $length) {
                    // the number of characters which are left
                    $left = $length - $total_length;
                    $entities_length = 0;
                    // search for html entities
                    if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
                        // calculate the real length of all entities in the legal range
                        foreach ($entities[0] as $entity) {
                            if ($entity[1]+1-$entities_length <= $left) {
                                $left--;
                                $entities_length += strlen($entity[0]);
                            } else {
                                // no more characters left
                                break;
                            }
                        }
                    }
                    $truncate .= substr($line_matchings[2], 0, $left+$entities_length);
                    // maximum lenght is reached, so get off the loop
                    break;
                } else {
                    $truncate .= $line_matchings[2];
                    $total_length += $content_length;
                }

                // if the maximum length is reached, get off the loop
                if($total_length>= $length) {
                    break;
                }
            }
        } else {
            if (strlen($text) <= $length) {
                return $text;
            } else {
                $truncate = substr($text, 0, $length - strlen($ending));
            }
        }

        // if the words shouldn't be cut in the middle...
        if (!$exact) {
            // ...search the last occurance of a space...
            $spacepos = strrpos($truncate, ' ');
            if (isset($spacepos)) {
                // ...and cut the text in this position
                $truncate = substr($truncate, 0, $spacepos);
            }
        }

        // add the defined ending to the text
        $truncate .= $ending;

        if($considerHtml) {
            // close all unclosed html-tags
            foreach ($open_tags as $tag) {
                    $truncate .= '</' . $tag . '>';
            }
        }

        return $truncate;

    } 
}
    // add the defined ending to the text
    $truncate .= $ending;

当您试图使用此函数时,您如何调用它?

可以使用省略号charcode而不是三个句号,…;您是对的;没有看到。该小部件提供显示文章标题或摘录的选项,这会在摘录中添加省略号,但不会在标题中添加省略号。在我看来,
返回$truncate
返回输出的html,但我不确定。其他函数处理缩略图,但这是唯一处理截断的函数。如果函数接收到包含html的文本,它也将返回包含html的截断文本,并进行一些腿部工作,以确保html本身不计入行le您可能想查看插件的分支位置,并选择使用文章标题或摘录。我的直觉是,此函数是为摘录而不是文章标题调用的,在文章标题案例中调用它应该会得到您想要的结果。