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 相关文章推荐
第十二节--类的自动加载
Nov 16 PHP
PHP常用代码
Nov 23 PHP
php获得文件扩展名三法
Nov 25 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
Mar 06 PHP
一步一步学习PHP(2)――PHP类型
Feb 15 PHP
PHP 根据IP地址控制访问的代码
Apr 22 PHP
PHP自定义函数收代码
Aug 01 PHP
PHP执行linux命令常用函数汇总
Feb 02 PHP
PHP类相关知识点实例总结
Sep 28 PHP
如何判断php mysqli扩展类是否开启
Dec 24 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
Nov 13 PHP
php中get_object_vars()在数组的实例用法
Feb 22 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
DSP接收机前端设想
2021/03/02 无线电
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
简单的代码实现jquery定时器
2014/01/03 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
常用python数据类型转换函数总结
2014/03/11 Python
Python中的二叉树查找算法模块使用指南
2014/07/04 Python
python实现每次处理一个字符的三种方法
2014/10/09 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
python树莓派红外反射传感器
2019/01/21 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
python获取引用对象的个数方式
2019/12/20 Python
使用K.function()调试keras操作
2020/06/17 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
Django缓存Cache使用详解
2020/11/30 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
大学生毕业自荐信
2013/10/10 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
学习十八大宣传标语
2014/10/09 职场文书
会议欢迎词
2015/01/23 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
详解MySQL集群搭建
2021/05/26 MySQL