php 中英文字符串截取,字符串长度

在做PHP开发的时候,由于我国的语言环境问题,所以我们常常需要对中文进行处理。在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启。当然,如果是用的自己的服务器,则只要在php.ini中开启即可。如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了。

以下几个函数用起来颇为顺手的。不过要知道,得在utf-8环境下使用。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

header(‘Content-type:text/html;charset=utf-8‘);

/**

* 可以统计中文字符串长度的函数

* @param $str 要计算长度的字符串

* @param $type 计算长度类型,0(默认)表示一个中文算一个字符,1表示一个中文算两个字符

*

*/

function abslength($str)

{

    if(empty($str)){

        return 0;

    }

    if(function_exists(‘mb_strlen‘)){

        return mb_strlen($str,‘utf-8‘);

    }

    else {

        preg_match_all("/./u", $str, $ar);

        return count($ar[0]);

    }

}

$str = ‘我们都是中国人啊,ye!‘;

$len = abslength($str);

var_dump($len);  //return 12

$len = abslength($str,‘1‘);

echo ‘<br />‘.$len//return 22

/*

    utf-8编码下截取中文字符串,参数可以参照substr函数

    @param $str 要进行截取的字符串

    @param $start 要进行截取的开始位置,负数为反向截取

    @param $end 要进行截取的长度

*/

function utf8_substr($str,$start=0) {

    if(empty($str)){

        return false;

    }

    if (function_exists(‘mb_substr‘)){

        if(func_num_args() >= 3) {

            $end = func_get_arg(2);

            return mb_substr($str,$start,$end,‘utf-8‘);

        }

        else {

            mb_internal_encoding("UTF-8");

            return mb_substr($str,$start);

        }      

    }

    else {

        $null = "";

        preg_match_all("/./u", $str, $ar);

        if(func_num_args() >= 3) {

            $end = func_get_arg(2);

            return join($null, array_slice($ar[0],$start,$end));

        }

        else {

            return join($null, array_slice($ar[0],$start));

        }

    }

}

$str2  = ‘wo要截取zhongwen‘;

echo ‘<br />‘;

echo utf8_substr($str2,0,-4); //return wo要截取zhon

支持gb2312,gbk,utf-8,big5 中文截取方法

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

/* 

* 中文截取,支持gb2312,gbk,utf-8,big5 

* @param string $str 要截取的字串 

* @param int $start 截取起始位置 

* @param int $length 截取长度 

* @param string $charset utf-8|gb2312|gbk|big5 编码 

* @param $suffix 是否加尾缀 

*/

public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) 

   if(function_exists("mb_substr")) 

   

       if(mb_strlen($str, $charset) <= $length) return $str

       $slice = mb_substr($str, $start, $length, $charset); 

   

   else

   

       $re[‘utf-8‘]   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/"

       $re[‘gb2312‘] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/"

       $re[‘gbk‘]          = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/"

       $re[‘big5‘]          = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/"

       preg_match_all($re[$charset], $str, $match); 

       if(count($match[0]) <= $length) return $str

       $slice = join("",array_slice($match[0], $start, $length)); 

   

   if($suffix) return $slice."…"

   return $slice

}

时间: 2024-08-06 03:45:39

php 中英文字符串截取,字符串长度的相关文章

【转载】C# 字符串截取指定长度的中文字符--精点

通常,一个中文会占两个字节的空间.很多语言里,一个中文字符就算是2个字符长度. 但在C#中,string里包含的中文字符只占一个字符长度.这就导致很多时候,使用string.SubString(int startIndex,int length)方法来截取字符会错位. 最近由于工作原因,会截取指定长度的字符来使用.但是在文档里,1个中文是2个长度来计算.刚开始还只是以为文档错误,后来才知道是由于C#的差异造成的. 刚开始,是直接到网上找算法,但是找到的算法,基本思路都是挨个字符判断(根据ASCI

Day04 字符串截取&amp;字符串初值&amp;数组&amp;字符串替换

一.字符串截取 ":"代表截取 1.1 ${var:起始位置:长度} 起始位置从0开始(为0可以省略)x=13918581996echo ${x::5}#只取前5位数字13918 1.2 expr substr "$var" 起始位置 长度 起始位置从1开始x=13918581996expr substr "$x" 1 513918 1.3 cut -b 起始位置-结束位置 按照顺序截取,起始位置从1开始echo $x|cut -b 1-5139

字符串-截取字符串指定长度+判断字符串是否可转化为数字

import org.apache.commons.lang3.StringUtils; /** * Created by weijun.nie on 2017/9/13. */ public class NiewjStringUtils { /** * 如果给定的字符串 targetString 大于 len 位, 则截取 len 位返回; 不大于,直接返回. * * @param targetString 给定的字符串 * @param len 指定的长度 * @return */ publ

DOS命令(cmd)批处理:替换字符串、截取字符串、扩充字符串、获取字符串长度

1.替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串.举例说明其功能:========================================= @echo off set aa=伟大的中国!我为你自豪! echo 替换前:%aa% echo 替换后:%aa:中国=中华人民共和国% echo aa = %aa% set "aa=%aa:中国=中华人民共和国%" echo aa = %aa% pause ==============================

ORACLE截取字符串

?? 每行显示固定字符串,截取字符串 方法一:在循环里面输出 DECLARE l_char          VARCHAR2 (3000 ) := 'ORACLEEB电子商务套件SSYSTEMghtest' ; l_length        NUMBER ; l_line_char     VARCHAR2 (1000 ); --每一个字符 l_lengthb       NUMBER ; --每一个字符的字节长度,汉字变成2个 l_lengthb_total NUMBER := 0 ; -

JavaScript截取超过长度的字符串(中英文都适用)

/** * js截取字符串,中英文都能用 * @param str:需要截取的字符串 * @param len: 需要截取的长度 */ function cutstr(str, len) { var str_length = 0; var str_len = str.length; str_cut = new String();for (var i = 0; i < str_len; i++) { a = str.charAt(i); str_length++; if (escape(a).le

ASP如何计算中英文混合字符串长度和截取字符串

用ASP做网站的时候经常会碰到要截取字符串的情况.ASP中的Len函数不管是中文字符,还是英文字符,统统按一个单位来计算,由于一个中文字符的宽度是一个英文字符宽度的两倍,在中英文混合的情况下字符串实际占用的宽度就不好计算了,如果按照Len函数计算的长度来截取字符串截出来的效果也会长短不一,下面是按照一个汉字相当于两个英文字符来计算字符串长度和截取字符串的代码 计算中英文混合字符串的长度: [vb] view plaincopyprint? function getStringLen(str) o

获得字符串实际长度,中文2,英文1 js截取字符串,中英文都能用

var GetLength = function (str) { ///<summary>获得字符串实际长度,中文2,英文1</summary> ///<param name="str">要获得长度的字符串</param> var realLength = 0, len = str.length, charCode = -1; for (var i = 0; i < len; i++) { charCode = str.charCo

求中英文混合字符串长度,中英文混合字符串截取(汉字2个字节,字母数字等1个字节),字符转ASCII码

/// <summary> /// 求字符串的实际长度(汉字2个字节,外语字符1个字节) /// </summary> /// <param name="str"></param> /// <returns></returns> public static int Length(string str) { int len = 0; char[] arr = str.ToCharArray(); for (int i