Php 在WordPress插件中的截断字符串末尾添加省略号
我试图在这个php函数生成的截断字符串的末尾添加一个省略号。它是Wordpress插件的一部分。但是,唉,我只是在学习php 我试着在函数末尾附近的结束html标记之前打印省略号,如下所示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
$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您可能想查看插件的分支位置,并选择使用文章标题或摘录。我的直觉是,此函数是为摘录而不是文章标题调用的,在文章标题案例中调用它应该会得到您想要的结果。