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中Date()时间日期函数的使用方法小结
Apr 20 PHP
基于Zend的Config机制的应用分析
May 02 PHP
php生成图形验证码几种方法小结
Aug 15 PHP
PHP数组相关函数汇总
Mar 24 PHP
Laravel 5 框架入门(一)
Apr 09 PHP
fckeditor上传文件按日期存放及重命名方法
May 22 PHP
php无序树实现方法
Jul 28 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
PHP实现正则表达式分组捕获操作示例
Feb 03 PHP
php+iframe 实现上传文件功能示例
Mar 04 PHP
PHP使用非对称加密算法RSA
Apr 21 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
str_replace只替换一次字符串的方法
2013/04/09 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
python批量赋值操作实例
2018/10/22 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
英国团购网站:Groupon英国
2017/11/28 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
介绍一下常见的木马种类
2014/11/15 面试题
同学聚会欢迎辞
2014/01/14 职场文书
政府采购方案
2014/06/12 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
先进个人事迹材料
2014/12/29 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
初中数学教学反思范文
2016/02/17 职场文书
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android