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调用数据库的存贮过程
Oct 09 PHP
在任意字符集下正常显示网页的方法一
Apr 01 PHP
PHP 数据库树的遍历方法
Feb 06 PHP
PHP中substr()与explode()函数用法分析
Nov 24 PHP
php表单敏感字符过滤类
Dec 08 PHP
为你总结一些php信息函数
Oct 21 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 PHP
详解no input file specified 三种解决方法
Nov 29 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
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
AngularJS 日期格式化详解
2015/12/23 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
Python中的集合类型知识讲解
2015/08/19 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
某公司C#程序员面试题笔试题
2014/05/26 面试题
应届大学生自荐信
2013/12/05 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
投标保密承诺书
2014/05/19 职场文书
小学生安全责任书
2014/07/25 职场文书
观后感的写法
2015/06/19 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
班级班风口号大全
2015/12/25 职场文书
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle
Java 死锁解决方案
2022/05/11 Java/Android