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 相关文章推荐
自己动手做一个SQL解释器
Oct 09 PHP
一个php作的文本留言本的例子(二)
Oct 09 PHP
js下函数般调用正则的方法附代码
Jun 22 PHP
深入解析PHP的引用计数机制
Jun 14 PHP
PHP中调用SVN命令更新网站方法
Jan 07 PHP
php文件缓存类用法实例分析
Apr 22 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
joomla实现注册用户添加新字段的方法
May 05 PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
PHP number_format函数原理及实例解析
Jul 14 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
优化PHP代码的53条建议
2008/03/27 PHP
php判断访问IP的方法
2015/06/19 PHP
js multiple全选与取消全选实现代码
2012/12/04 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
2015/10/19 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
Vuex简单入门
2017/04/19 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
2017/09/14 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
用python制作个音乐下载器
2021/01/30 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
毕业生自我鉴定实例
2014/01/21 职场文书
房产继承公证书
2014/04/09 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
幸福中国演讲稿
2014/09/12 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
考试作弊检讨书
2014/10/21 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
赡养老人协议书范本
2015/08/06 职场文书
创业计划书之水果店
2019/07/18 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技