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来自动调用不同服务器上的flash
Oct 09 PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
Oct 27 PHP
PHP类的反射用法实例
Nov 03 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
Mar 12 PHP
php微信公众平台开发之获取用户基本信息
Aug 17 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
PHP QRCODE生成彩色二维码的方法
May 19 PHP
PHP实现的折半查询算法示例
Oct 09 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
php判断电子邮件是否正确方法
Dec 04 PHP
PHP判断当前使用的是什么浏览器(推荐)
Oct 27 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
php 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
浅析PHP微信支付通知的处理方式
2014/05/25 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
jQuery each()方法的使用方法
2010/03/18 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
js日期联动示例
2014/05/02 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
简单的Python的curses库使用教程
2015/04/11 Python
Python3简单实例计算同花的概率代码
2017/12/06 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
实例讲解Python3中abs()函数
2019/02/19 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
Pytorch转tflite方式
2020/05/25 Python
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
邀请函的格式
2015/01/30 职场文书
小学重阳节活动总结
2015/03/24 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
python 详解turtle画爱心代码
2022/02/15 Python