字符串的截取(CSS,JS,php)

 在网页排版设计中,会遇到文本超过固定长度导致整体的网页变形的情况。程序员往往需要截取固定的长度来实现某些固定长度的控制。

 首先介绍一种直接采用CSS的 代码控制来实现文本截取的方法,与程序员的直接字符截取的方式有些区别,其优势是可以自动控制文本显示的长度;缺点是不同浏览器的兼容性并不完美。

一、CSS截取

CSS代码:

<style>
.texthidden
{
   width
:200px; //指定宽度:
   overflow
:hidden;  //将超出内容隐藏
   text-overflow
:ellipsis; //IE专用属性,文本溢出时显示省略标记();其他浏览器不支持。
   white-space
:nowrap;  //强制内容不换行。强制在同一行内显示所有文本,直到文本结束或者遭遇 br 元素
   border
:1px solid #ddd;}
</style>

 HTML代码:

<div class="texthidden">
    CSS让容器的溢出部分内容隐藏起来
</div>
目前使用这种方法比较成功的示例是Gmail的内容显示,在IE下达到最好的效果。如果是FF那就比较糟糕,总是会出现截取半个中文的效果。其中涉及到最 主要的原因是 text-overflow 这个属性只在IE下有效,目前很多CSS属性也存在这个问题,特别重要的是Margin和Padding这两个属性,往往导致页面出现各种不同的效果;在 页面设计的时候,需要注意这些属性在不同浏览器的显示效果。

 

二、JS截取 

1.substr 方法

 返回一个从指定位置开始的指定长度的子字符串  

stringvar.substr(start [, length ])

参数

stringvar

必选项。要提取子字符串的字符串文字或 String 对象。

start

必选项。所需的子字符串的起始位置。字符串中的第一个字符的索引为 0

length

可选项。在返回的子字符串中应包括的字符个数。

说明

如果 length 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到 stringvar 的最后。

 示例

下面的示例演示了substr 方法的用法。

function SubstrDemo(){
   var s, ss;                // 声明变量。
   var s = "The rain in Spain falls mainly in the plain.";
   ss = s.substr(12, 5); // 获取子字符串。
   return(ss);               // 返回 "Spain"。
}

 2.substring 方法

返回位于 String 对象中指定位置的子字符串。

strVariable.substring(start, end)

参数

start

指明子字符串的起始位置,该索引从 0 开始起算。

end

指明子字符串的结束位置,该索引从 0 开始起算。

说明

substring 方法将返回一个包含从 start 到最后(不包含 end )的子字符串的字符串。

substring 方法使用 start end 两者中的较小值作为子字符串的起始点。例如, strvar.substring(0, 3) strvar.substring(3, 0) 将返回相同的子字符串。

如果 start end NaN 或者负数,那么将其替换为0

子字符串的长度等于 start end 之差的绝对值。例如,在 strvar.substring(0, 3) strvar.substring(3, 0) 返回的子字符串的的长度是 3

示例

下面的示例演示了 substring 方法的用法。
function SubstringDemo(){
   var ss;                         // 声明变量。
   var s = "The rain in Spain falls mainly in the plain..";
   ss = s.substring(12, 17);   // 取子字符串。
   return(ss);                     // 返回子字符串。
}

 

如果仅是英文,那么我们可以用String.substring(start, end)函数就已经够用了。但是通常我们都会遇到既有英文,又有汉字的情况。而汉字是占用2个字节的,如果用 String.substring(start, end)截取字符串的话,会发现汉字截取后比英文截取后个数虽然相同,但是长度还是长出去不少(具体要视字符个数来决定)。
为了解决这个问题昨天写了根据字节数截取字符串的函数。
具 体使用很简单,跟String.subString(start, end)一样使用就可。比如:var str = "诶必塞第衣爱抚即"; var str1 = str.subCHStr(2, 2); var str2 = str.subCHString(2, 4); alert(str1 + " == " + str2);

 Code
 //计算字符串长度
String.prototype.strLen = function() {
    var len = 0;
    for (var i = 0; i < this.length; i++) {
        if (this.charCodeAt(i) > 255 || this.charCodeAt(i) < 0) len += 2; else len ++;
    }
    return len;
 }
//将字符串拆成字符,并存到数组中
String.prototype.strToChars = function(){
   var chars = new Array();
   for (var i = 0; i < this.length; i++){
       chars[i] = [this.substr(i, 1), this.isCHS(i)];
   }
   String.prototype.charsArray = chars;
   return chars;
}
//判断某个字符是否是汉字
String.prototype.isCHS = function(i){
   if (this.charCodeAt(i) > 255 || this.charCodeAt(i) < 0) 
       return true;
   else
       return false;
}
//截取字符串(从start字节到end字节)
String.prototype.subCHString = function(start, end){
   var len = 0;
   var str = "";
   this.strToChars();
   for (var i = 0; i < this.length; i++) {
       if(this.charsArray[i][1])
           len += 2;
       else
           len++;
       if (end < len)
           return str;
       else if (start < len)
           str += this.charsArray[i][0];
   }
   return str;
}
//截取字符串(从start字节截取length个字节)
String.prototype.subCHStr = function(start, length){
   return this.subCHString(start, start + length);
}

 

三、PHP

1.PHP有自带的substr()函数可以 分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr() /mb_strcut的用法与substr()相似,只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是 一般的服务器都没打开php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开。

举个例子:

<?php
echo mb_substr('这样一来我的字符串就不会有乱码', 0, 7, 'utf-8');//输出:这样一来我的字
?>
<?php
echo mb_strcut('这样一来我的字符串就不会有乱码', 0, 7, 'utf-8');//输出:这样一
?>

从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象

2.下面给大家介绍一种可支持gb2312,gbk,big三种编码的

/****CSDN论坛PHP斑竹xuzuning(唠叨)老大的,支持gb2312,gbk,big三种编码。
以下是代码:**
*/
$len = 19;
$text = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?";
echo strlen($text)<=$len ? $text : (substr($text,0,$len).chr(0)."....");
/****chr(0)不是null
null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000
虽然chr(0)不会显示出什么,但是他是一个字符。
当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空”
根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了
注:
编码 第一字节 第二字节
gb2312 0xa1-0xf7 0xa1-0xfe
gbk 0x81-0xfe 0x81-0xfe 0x40-0x7e
big5 0xa1-0xf7 0x81-0xfe 0x40-0x7e
其次这个是网上搜索的,支持utf-8编码,原作者不详:
 ****
*/
     function subString_UTF8($str$start$lenth)
    {
        $len = strlen($str);
        $r = array();
        $n = 0;
        $m = 0;
        for($i = 0; $i < $len$i++) {
            $x = substr($str$i, 1);
            $a  = base_convert(ord($x), 10, 2);
            $a = substr('00000000'.$a, -8);
            if ($n < $start){
                if (substr($a, 0, 1) == 0) {
                }elseif (substr($a, 0, 3) == 110) {
                    $i += 1;
                }elseif (substr($a, 0, 4) == 1110) {
                    $i += 2;
                }
                $n++;
            }else{
                if (substr($a, 0, 1) == 0) {
                    $r[ ] = substr($str$i, 1);
                }elseif (substr($a, 0, 3) == 110) {
                    $r[ ] = substr($str$i, 2);
                    $i += 1;
                }elseif (substr($a, 0, 4) == 1110) {
                    $r[ ] = substr($str$i, 3);
                    $i += 2;
                }else{
                    $r[ ] = '';
                }
                if (++$m >= $lenth){
                    break;
                }
            }
        }
        return $r;
    } // End subString_UTF8;
}// End String

#由于此函数返回的是一个数组,因此要配合join函数来显示字符串:
#
join('',subString_UTF8($str, $start, $lenth));
#
在页面显示的时候还可以在此语句后面连一个"..."

 

 

posted @ 2012-04-12 17:34  漠北风  阅读(641)  评论(0)    收藏  举报