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 adodb分页实现代码
Mar 19 PHP
PHP 输出简单动态WAP页面
Jun 09 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
Oct 13 PHP
php中session与cookie的比较
Jan 27 PHP
Smarty分页实现方法完整实例
May 11 PHP
php 解析xml 的四种方法详细介绍
Oct 26 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 PHP
php实现的生成排列算法示例
Jul 25 PHP
phpfpm的作用和用法
Oct 10 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 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
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
jQuery操作 input type=checkbox的实现代码
2012/06/14 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
JS实现的省份级联实例代码
2013/06/24 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
Python中获取对象信息的方法
2015/04/27 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
Python中的元组介绍
2019/01/28 Python
更新修改后的Python模块方法
2019/03/03 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
校园新闻广播稿5篇
2014/10/10 职场文书
投资入股合作协议书
2014/10/28 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
校园之声广播稿
2015/08/18 职场文书