编写PHP程序检查字符串中的中文字符个数的实例分享_php实例

有时候我们需要计算一个字符串中包含的字数,对于纯英文字符串,字数等于字符串长度,用
strlen函数即可获得,但如果字符串中包含中文怎办?mb_strlen可以实现,但不幸没装扩展,那就自己实现一下吧。

php有一个扩展一般是必装的,我们可以使用mb_strlen来获取字符串中的字数,用法一般如下:

$len = mb_strlen("你是我的小苹果","utf-8");

如愿获得字符串长度:7.

如果没装mb扩展呢?自己实现一下吧。

我们要先明白一个事实:字符串是由字符组成的,而字符是由字节表示的,每个英文字符是一个字节,对应一个ascii码,英文字符的ascii码是小于128的,也就是十六进制的 0x80 .当一个字节的ascii码超过了127,那就说明当前字节不是一个完整的字符。

比如

$str = "你是我的小苹果";

中的$str{0}可以取到第一个字节,我们来看一下它是啥:

php > $str = "你是我的小苹果";
php > echo $str{0};
�

是个乱码,它只是

复制代码 代码如下:


       
字的字节之一,也就是说,

复制代码 代码如下:

这个字符是由超过一个字节组成的,我们这样试试:

php > echo $str{0}.$str{1}.$str{2};


可以看到,将三个字节连在一起输出,就成了一个完整的

复制代码 代码如下:



至于这里为什么是三个字节,而不是两个或4个?这个取决于字符串的编码,我这里控制台默认是utf8编码的,在PHP中,一个utf8字符是用三个字节表达的,如果是gbk编码,则会是两个字节。至于编码和字节的关系,这个话题比较大,一篇说不完,请参考这篇文章:字符编码笔记:ascii,unicode和utf8 。

知道了这些,我们就可以自己编写一个字数检查的函数了,大致流程如下:

1.for循环遍历字节 2.判断字节编码是否 >= 0x80,是的话跳过N个字节

我写了个简单的函数,可以判断gbk或utf8字符串的长度,仅供参考:

<?php

function mbstrlen($str,$encoding="utf8")
{

  if (($len = strlen($str)) == 0) {
    return 0;
  }

  $encoding = strtolower($encoding);

  if ($encoding == "utf8" or $encoding == "utf-8") {
    $step = 3;
  } elseif ($encoding == "gbk" or $encoding == "gb2312") {
    $step = 2;
  } else {
    return false;
  }

  $count = 0;
  for ($i=0; $i<$len; $i++) {
    $count++;
    //如果字节码大于127,则根据编码跳几个字节
    if (ord($str{$i}) >= 0x80) {
      $i = $i + $step - 1;//之所以减去1,因为for循环本身还要$i++
    }
  }
  return $count;
}

echo mbstrlen(iconv("utf-8","gbk","你是我的小苹果"),"gbk");
echo mbstrlen("你是我的小苹果");

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 字符串
中文字符
编写字符串复制函数、shell字符串实例、json字符串实例、plsql 截取字符串实例、字符串程序实例,以便于您获取更多的相关知识。

时间: 2024-10-10 01:48:08

编写PHP程序检查字符串中的中文字符个数的实例分享_php实例的相关文章

Lua判断字符串中包含中文字符的方法和计算字符串宽度函数分享_Lua

一.判断字符串中包含中文字符的方法 遍历数组,对每个字节使用string.byte(),发现有大于127的,就是汉字,可以参照下面的代码. 二.计算字符串宽度函数 复制代码 代码如下: -- 计算字符串宽度   local str = "Jimmy: 你好,世界!" local fontSize = 20 local lenInByte = #str local width = 0   for i=1,lenInByte do     local curByte = string.by

PHP指定截取字符串中的中英文或数字字符的实例分享_php实例

我们在开发过程中,经常会碰到截取中文英文数字等的问题,大家知道中文所占的字符和英文数字是不同的:然后我们就会在项目的common里写一些日常的函数包含时间计算转换和中英文字符截取的函数:比如截取中英文的函数没个几行代码恐怕拿不下来的吧,现在就告诉大家一个简单的(自己本地运行过的),如有问题,请大家多多指教   $c = 'ddaabbccaa'; $d = '地球需要我们每个人的爱护'; $frist1 = mb_substr( $c, 0, 1 ,"UTF-8"); // d $de

PHP在字符串中查找指定字符串并删除的代码_php技巧

$a = "abcababa"; $count=strpos($a,"ab"); $str=substr_replace($a,"",$count,2); 输出结果:cababa 代码虽短,但也算是一个小算法!

PHP编写学校网站上新生注册登陆程序的实例分享_php实例

就弄了三个页面: (1).新生信息注册模块(register.php): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text

PHP实现Javascript中的escape及unescape函数代码分享_php实例

这个类相当好用.作用么,PHP做JSON传递GBK字符,比如中文,日文,韩文神马的Unicode最合适不过了.. <?php classcoding { //模仿JAVASCRIPT的ESCAPE和UNESCAPE函数的功能 functionunescape($str) { $text=preg_replace_callback("/%u[0-9A-Za-z]{4}/",array( &$this, 'toUtf8' ),$str); returnmb_convert_e

PHP中使用sleep函数实现定时任务实例分享_php实例

在某些程序中,有一些特殊的功能需要用到定时执行,如果熟悉Linux的朋友肯定会说这不是容易吗,直接来个计划任务crontab不久实现了吗?这的确是可以实现,但必须是提前知道具体的执行时间,然后才能写到计划任务里去.比如凌晨两点,上午七点,或者每天上午六点三十分等等. 然而有时候,这个时间我们无法预知,而执行时间是程序动态生成的.然后在动态生成的时间后执行某些程序片段,这里就不能用Linux的crontab计划任务了,因为每次执行的时间都是动态生成,而计划任务需要知道一个定死了的时间.既然无法使用

WordPress中访客登陆实现邮件提醒的PHP脚本实例分享_php实例

登陆邮件提醒实现方法前提是空间有邮件功能,测试有无邮件功能的方法:登录界面点击"忘记密码",有邮件发到你邮箱就有邮件功能. 一.登录成功提醒就像银行的登录提醒一样,如果有人登录了系统,就会发一封邮件到邮箱,提醒你有人登录了,如果当时不是你登录,就要引起警惕了.将以下代码放入主题的functions.php中: /***************************************************** 函数名称:wp_login_notify v1.0 by DH.hu

php中simplexml_load_string使用实例分享_php实例

先用一段代码重现一下问题 乍一看,结果很让人费解: 复制代码 代码如下: <?php $string = <<<EOF <data> <foo><bar>hello</bar></foo> <foo><bar>world</bar></foo> </data> EOF; $data = simplexml_load_string($string); print_r

请问如何替换字符串中大写中文数字为阿拉伯数字?

问题描述 我有几个字符串,如 我有十块钱,你有二十三块钱,他有二元钱.我想转换成 "我有10块钱,你有23块钱,他有2元钱.",请问如何转换,也就是如何把字符串中大写中文数字转换成阿拉伯数字.大写中文数字可限制在一到九百九十九之间.谢谢! 解决方案 package test;import java.text.MessageFormat;import java.util.ArrayList;import java.util.HashMap;import java.util.LinkedH