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脚本的10个技巧(6)
Oct 09 PHP
Discuz 模板引擎的封装类代码
Jul 18 PHP
ThinkPHP字符串函数及常用函数汇总
Jul 18 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
Dec 17 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
php 函数使用可变数量的参数方法
May 02 PHP
php批量删除操作(数据访问)
May 23 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
用PHP做了一个领取优惠券活动的示例代码
Jul 05 PHP
php探针不显示内存解决方法
Sep 17 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 17 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
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
php查询ip所在地的方法
2014/12/05 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
Python标准库之Sys模块使用详解
2015/05/23 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
Python Process多进程实现过程
2019/10/22 Python
keras 读取多标签图像数据方式
2020/06/12 Python
python如何将图片转换素描画
2020/09/08 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
行政专员岗位职责
2014/01/02 职场文书
单位委托书范本
2014/04/04 职场文书
中秋晚会策划方案
2014/06/12 职场文书
技术经济专业求职信
2014/09/03 职场文书
幼儿园安全教育随笔
2015/08/14 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
mysql全面解析json/数组
2022/07/07 MySQL
Docker部署Mysql8的实现步骤
2022/07/07 Servers