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 相关文章推荐
一键删除顽固的空文件夹 软件下载
Jan 26 PHP
php学习之运算符相关概念
Jun 09 PHP
php selectradio和checkbox默认选择的实现方法详解
Jun 29 PHP
Codeigniter注册登录代码示例
Jun 12 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
php截取html字符串及自动补全html标签的方法
Jan 15 PHP
php获取远程文件大小
Oct 20 PHP
Yii2单元测试用法示例
Nov 12 PHP
CI(CodeIgniter)框架实现图片上传的方法
Mar 24 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
Laravel5.1框架注册中间件的三种场景详解
Jul 09 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下统计用户在线时间的一种尝试
2010/08/26 PHP
WordPress网站性能优化指南
2015/11/18 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
jQuery中prepend()方法用法实例
2014/12/25 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
[00:11]战神迅矛
2019/03/06 DOTA
介绍Python的@property装饰器的用法
2015/04/28 Python
浅谈Python处理PDF的方法
2017/11/10 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
Python虚拟环境venv用法详解
2020/05/25 Python
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
预订奥兰多和佛罗里达州公园门票:FloridaTix
2018/01/03 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
JDO的含义
2012/11/17 面试题
幼儿运动会邀请函
2014/01/17 职场文书
七年级数学教学反思
2014/01/22 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
青年志愿者活动方案
2014/08/17 职场文书
毕业论文致谢词
2015/05/14 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
python中的random模块和相关函数详解
2022/04/22 Python