PHP 中英文混合排版中处理字符串常用的函数


Posted in PHP onApril 12, 2007

# 判断某个位置是中文字符的左还是右半部分,或不是中文 
# 返回值 -1 左 0 不是中文字符 1 右 
# 用法 
/* 
$a = 'this is 中文'; 
print is_chinese($a, 1); // 0 
print is_chinese($a,8); // -1 
print is_chinese($a,9); // 1 
*/ 
function is_chinese(&$str, $location) { 
$ch = true; 
$i = $location; 
while(ord($str[$i])>0xa0 && $i >= 0) { 
$ch = !$ch; 
$i --; 

if($i != $location) { 
$f_str = $ch ? 1: -1; 

else { 
$f_str = false; 

return $f_str; 

# 中文字符串倒置函数 
# 如果一个将一个有中文的字符串用strrev倒过来,就会产生乱码 
/* 
print cstrrev('this is 中文'); // 文中 si siht 
*/ 

function cstrrev(&$str) { 
$long = strlen($str); 
for($f_str='', $chinese=false, $i=$long-1; $i>=0; $i--) { 
if(ord($str[$i]) > 0xa0) { 
$chinese = ! $chinese; 
if($chinese == false) { 
$f_str .= $str[$i].$str[$i+1]; 


else { 
$f_str .= $str[$i]; 


return $f_str; 

/* 中文字符串截取函数 
一些中文字符串截取函数经常有一些问题,例如在一些自动换行程序中 
$a=“1中2”; 
经两次截取后, 
csubstr($str,$a,0,2); 
csubstr($str, $a, 2,2) 
由于载取位置指向“中”的右字节,可能会是这样的结果 
1, 2 
用本函数会产生正确的结果 
1中, 2 
*/ 
# start 开始位置,从0开始 
# long = 0 则从start 一直取到字符串尾 
# ltor = true 时从左到右取字符,false 时到右到左取字符 
# $cn_len 中文字符按字节取还是字数取,如果按字数取,则一个中文当一个字节计算 

function csubstr(&$str, $start=0, $long=0, $ltor=true, $cn_len=2) { 
if($long == 0) $long = strlen($str); 
if($ltor == false) $str = cstrrev($str); 

if($cn_len == 1) { 

for($i=0, $fs=0; $i<$start; $fs++) 
$i += (ord($str[$fs]) <= 0xa0) ? 1 : 0.5; 
for($i=0, $fe=$fs; $i<$long; $fe++) 
$i += (ord($str[$fe]) <= 0xa0) ? 1 : 0.5; 
$long = $fe - $fs; 


else { 

$fs = (is_chinese($str, $start) == 1) ? $start - 1 : $start; 
$fe = $long + $start - 1; 
$end = ( is_chinese($str, $fe) == -1 ) ? $fe -1 : $fe; 
$long = $end - $fs + 1; 

$f_str = substr($str, $fs, $long); 
if($ltor == false) $f_str = cstrrev($f_str); 

return $f_str; 

# 取左字符串 
# 当cn_len == 2 时 $long 取左边多少个字,反之则取左边多少个字节 
function cleft(&$str, $long, $cn_len=2) { 
$f_str = csubstr($str, 0, $long, true, $cn_len); 
return $f_str; 

# 取右字符串 
function cright(&$str, $long, $cn_len=2) { 
$f_str = cstrrev($str); 
$f_str = csubstr($f_str, 0, $long, true, $cn_len); 
$f_str = cstrrev($f_str); 
return $f_str; 

# 对含有中文字符的文章分行格式化 
# 再也不会发生因换行问题而产生的种种问题啦!!! 
# 注:文章的每一行必须用 n (chr(13))进行分行 
# $width 每行多少字符 
# $br 将 每行用什么字符当结束符 

function ctext_wrap(&$text, $width=60, $br="<BR>") { 
$lines = explode("n",$text); 
$rows = count($lines); 

for($i=0; $i<$rows; $i++) { 
$len = strlen($lines[$i]); 
for($j=0; $j<$len; $j+=$width) { 
$p = $j + $width - 1; 
$k = 0; 
if($p<$len) { 
while(!is_chinese($lines[$i], $p) && $lines[$i][$p] != ' ' && $p>$j) { 
$k ++; 
$p --; 

if($p == $j) $k = 0; 

$f_str .= csubstr($lines[$i], $j, $width-$k) . $br; 
$j -= $k; 


return $f_str; 

PHP 相关文章推荐
php基础知识:类与对象(1)
Dec 13 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
Aug 18 PHP
用PHP书写安全的脚本代码
Feb 05 PHP
浅析php中抽象类和接口的概念以及区别
Jun 27 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 PHP
php设置页面超时时间解决方法
Sep 22 PHP
php判断用户是否关注微信公众号
Jul 22 PHP
php 数组元素快速去重
May 05 PHP
PHP中TP5 上传文件的实例详解
Jul 31 PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
PHP字符转义相关函数小结(php下的转义字符串)
Apr 12 #PHP
如何提高MYSQL数据库的查询统计速度 select 索引应用
Apr 11 #PHP
相对路径转化成绝对路径
Apr 10 #PHP
PHP实现MVC开发得最简单的方法――模型
Apr 10 #PHP
PHP+Tidy-完美的XHTML纠错+过滤
Apr 10 #PHP
ASP和PHP都是可以删除自身的
Apr 09 #PHP
收藏的一个php小偷的核心程序
Apr 09 #PHP
You might like
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
php网页病毒清除类
2014/12/08 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
PHP 中常量的知识整理
2017/04/14 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
tagName的使用,留一笔
2006/06/26 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
ionic3 懒加载
2017/08/16 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
[00:10]DOTA2全国高校联赛 以DOTA2会友
2018/05/30 DOTA
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
python如何保证输入键入数字的方法
2019/08/23 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
如何提高SQL Server的安全性
2016/07/25 面试题
中学老师的自我评价
2013/11/07 职场文书
《阳光》教学反思
2014/02/23 职场文书
分公司负责人任命书
2014/06/04 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
机器人瓦力观后感
2015/06/12 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
初三化学教学反思
2016/02/22 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL