我使用的PHP面包屑功能有问题,当页面名称很长时,它会溢出开箱即用,然后看起来很难看。
我的问题是,我怎样才能实现这个目标:“这是一个很长的字符串”到“这是......”用PHP?
关于我如何处理这个问题的任何其他想法也将被提前感谢!
这是面包屑功能:
function breadcrumbs() {
// Breadcrumb navigation
if (is_page() && !is_front_page() || is_single() || is_category()) {
echo '<ul class="breadcrumbs">';
echo '<li class="front_page"><a href="'.get_bloginfo('url').'">'.get_bloginfo('name').'</a> <span style="color: #FFF;">»</span> </li>';
if (is_page()) {
$ancestors = get_post_ancestors($post);
if ($ancestors) {
$ancestors = array_reverse($ancestors);
foreach ($ancestors as $crumb) {
echo '<li><a href="'.get_permalink($crumb).'">'.get_the_title($crumb).'</a> <span style="color: #FFF;">»</span> </li>';
}
}
}
if (is_single()) {
$category = get_the_category();
echo '<li><a href="'.get_category_link($category[0]->cat_ID).'">'.$category[0]->cat_name.'</a></li>';
}
if (is_category()) {
$category = get_the_category();
echo '<li>'.$category[0]->cat_name.'</li>';
}
// Current page
if (is_page() || is_single()) {
echo '<li class="current">'.get_the_title().'</li>';
}
echo '</ul>';
} elseif (is_front_page()) {
// Front page
echo '<ul class="breadcrumbs">';
echo '<li class="front_page"><a href="'.get_bloginfo('url').'">'.get_bloginfo('name').'</a></li>';
echo '<li class="current">Home Page</li>';
echo '</ul>';
}
}
答案 0 :(得分:5)
如果你想要一个更好的(字数限制)trucation,你可以使用explode
用空格分割字符串然后追加每个单词(数组条目)直到你达到你的最大限度
类似的东西:
define("MAX_LEN", 15);
$sentance = "Hello this is a long sentance";
$words = explode(' ', $sentance);
$newStr = "";
foreach($words as $word) {
if(strlen($newStr." ".$word) >= MAX_LEN) {
break;
}
$newStr = $newStr." ".$word;
}
答案 1 :(得分:5)
如果您使用UTF-8作为字符集,我建议使用mb_strimwidth
方法,因为它是多字节安全的并且不会弄乱多字节字符。它还会自动添加...
这样的占位符字符串,substr
您必须在另外的步骤中执行此操作。
使用示例:
echo mb_strimwidth("Hello World", 0, 10, "...", "UTF-8"); // .. or some other charset
// outputs Hello W...
答案 2 :(得分:2)
您可以安全地使用substr。
答案 3 :(得分:1)
并最终wordwrap()打破长话
答案 4 :(得分:1)
$ string =“这是一个非常长的字符串”;
$ newString = substr($ string,0,7)。“...”;
//输出=这是......
答案 5 :(得分:1)
理想情况下,它应该在客户端完成。您可以使用CSS / JS。
设置此CSS属性:text-overflow: ellipsis。 但是,它只能在IE中使用。要在Firefox中使用相同的功能,您可以执行this。
之类的操作如果您不介意使用javascript插件,请使用jQuery ellipsis plugin之一。
编辑:这些方法即使在处理unicode时也能正常工作,如果你尝试用php处理这个问题,这可能有点棘手。 (与substr函数一样)
编辑2:如果您的问题只是溢出的文字,并且您不介意最后没有“...”那么它就更简单了。只需使用CSS:text-overflow: hidden;
。
答案 6 :(得分:0)
您可以截断最大长度的字符串,然后搜索最后一个空格:
多字节安全(需要PHP&gt; = 4.2)
function mb_TruncateString($string, $length = 40, $marker = "...")
{
if (mb_strlen($string) <= $length)
return $string;
// Trim at given length
$string = mb_substr($string, 0, $length);
// Get the text before the last space
if(mb_ereg("(.*)\s", $string, $matches))
$string = $matches[1];
return $string . $marker;
}
以下不是多字节安全
function TruncateString($string, $length = 40, $marker = "...")
{
if (strlen($string) <= $length)
return $string;
// Trim at given length
$string = substr($string, 0, $length);
// Get the text before the last space
if(preg_match("/(.*)\s/i", $string, $matches))
$string = $matches[1];
return $string . $marker;
}
答案 7 :(得分:-2)
您正在执行截断功能。这就是我使用的:
/**
* @param string $str
* @param int $length
* @return string
*/
function truncate($str, $length=100)
{
$str = substr($str, $length);
$words = explode(' ', $str); // separate words into an array
array_pop($words); // discard last item, as 9/10 times it's a partial word
$str = implode(' ', $words); // re-glue the string
return $str;
}
用法:
echo truncate('This is a very long page name that will eventually be truncated', 15);