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
php miniBB中文乱码问题解决方法
Nov 25 PHP
php Memcache 中实现消息队列
Nov 24 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP迭代器的内部执行过程详解
Nov 12 PHP
php类声明和php类使用方法示例分享
Mar 29 PHP
php简单图像创建入门实例
Jun 10 PHP
php编程每天必学之验证码
Mar 03 PHP
利用PHP自动生成印有用户信息的名片
Aug 01 PHP
浅谈laravel中的关联查询with的问题
Oct 10 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
mysql总结之explain
2012/02/27 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
把textarea中字符串里含有的回车换行替换成&amp;lt;br&amp;gt;的javascript代码
2007/04/20 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
实例讲解v-if和v-show的区别
2019/01/31 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python三元运算符实现方法
2013/12/17 Python
Python中的元类编程入门指引
2015/04/15 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
python format 格式化输出方法
2018/07/16 Python
机器学习实战之knn算法pandas
2019/06/22 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
高二美术教学反思
2014/01/14 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript
使用python求解迷宫问题的三种实现方法
2022/03/17 Python