zoukankan      html  css  js  c++  java
  • php判断字符串长度 strlen()与mb_strlen()函数

    strlen()

    PHP strlen() 函数

    定义和用法

    strlen() 函数返回字符串的长度。

    语法

    strlen(string)

    参数:string 
    描述:必需。规定要检查的字符串。

     代码如下 复制代码


    <?php 
    $str=‘中文a字1符‘; 
    echo strlen($str); 
    echo ‘<br />‘; 
    echo mb_strlen($str,‘UTF8‘); 
    //输出结果 
    //14 
    //6 
    ?>

    结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14
    在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6


    mb_strlen()函数

    需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保

    “extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

     代码如下 复制代码

    <?php 
    $str=‘中文a字1符‘; 
    //计算如下 
    echo (strlen($str) + mb_strlen($str,‘UTF8‘)) / 2; 
    echo 
    //输出结果 
    //10 
    ?>

    “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.

    讲解这两者之间的区别

     代码如下 复制代码


    <?php

    //测试时文件的编码方式要是UTF8

    $str='中文a字1符';

    echo strlen($str).'<br>';//14

    echo mb_strlen($str,'utf8').'<br>';//6

    echo mb_strlen($str,'gbk').'<br>';//8

    echo mb_strlen($str,'gb2312').'<br>';//10

    ?> 

    结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14,在mb_strlen

    计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6 .


    虽然上面函数可以简单解决一些中英文混合问题,但是不能用于实实际中,下面我来给各位朋友介绍其它比较好的办

    法。

    PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改

     代码如下 复制代码

    /**
    * PHP获取字符串中英文混合长度 
    * @param $str string 字符串
    * @param $$charset string 编码
    * @return 返回长度,1中文=1位,2英文=1位
    */
    function strLength($str,$charset='utf-8'){
    if($charset=='utf-8') $str = iconv('utf-8','gb2312',$str);
    $num = strlen($str);
    $cnNum = 0;
    for($i=0;$i<$num;$i++){
    if(ord(substr($str,$i+1,1))>127){
    $cnNum++;
    $i++;
    }
    }
    $enNum = $num-($cnNum*2);
    $number = ($enNum/2)+$cnNum;
    return ceil($number);
    }

    //测试输出长度都为15
    $str1 = '测试测试测试测试测试测试测试测';
    $str2 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
    $str3 = 'aa测试aa测试aa测试aa测试aaaaaa';
    echo strLength($str1,'gb2312');
    echo strLength($str2,'gb2312');
    echo strLength($str3,'gb2312');

    截取字符串函数

    UTF8编码,在UTF8中,一个中文字符占3个字节

     代码如下 复制代码

    function msubstr($str, $start, $len) {
     $tmpstr = "";
     $strlen = $start + $len;
     for($i = 0; $i < $strlen; $i++){
      if(ord(substr($str, $i, 1)) > 127){
       $tmpstr.=substr($str, $i, 3);
       $i+=2;
      }else
       $tmpstr.= substr($str, $i, 1);
     }
     return $tmpstr;
    }
    echo msubstr("一二三天下致公english",0,10);

    GB2312编码,在gb2312中,一个中文字符占2个字节

     代码如下 复制代码

    <?php
    function msubstr($str, $start, $len) {   //ȡ
       $tmpstr = "";
       $strlen = $start + $len;
       if(preg_match('/[/d/s]{2,}/',$str)){$strlen=$strlen-2;}
       for($i = 0; $i < $strlen; $i++) {
           if(ord(substr($str, $i, 1)) > 0xa0) {
               $tmpstr .= substr($str, $i, 2);
               $i++;
           } else
               $tmpstr .= substr($str, $i, 1);
         }
       return $tmpstr;
     }
      
    ?>

    编码兼容性良好的函数

     代码如下 复制代码

    function cc_msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
    {
     if(function_exists("mb_substr"))
      return mb_substr($str, $start, $length, $charset);
     elseif(function_exists('iconv_substr')) {
      return iconv_substr($str,$start,$length,$charset);
     }
     $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);
     $slice = join("",array_slice($match[0], $start, $length));
     if($suffix) return $slice."…";
     return $slice;
    }

  • 相关阅读:
    剩余类&完全剩余组
    同余验算法
    一种快速余数求法
    同余的性质II
    同余初步
    求N个数的最小公倍数
    N个数GCD求解法
    快速求解GCD的三个Trick
    质数的几个有趣问题
    等比数列求和公式
  • 原文地址:https://www.cnblogs.com/aprils/p/4988134.html
Copyright © 2011-2022 走看看