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的中问验证码
Nov 25 PHP
PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
Jan 30 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
解析php安全性问题中的:Null 字符问题
Jun 21 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
基于PHP技术开发客服工单系统
Jan 06 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
php实现微信原生支付(扫码支付)功能
May 30 PHP
简单实用的PHP文本缓存类实例
Mar 22 PHP
php7性能提升的原因详解
Oct 13 PHP
laravel model 两表联查示例
Oct 24 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
我常用的几个类
2006/10/09 PHP
php执行sql语句的写法
2009/03/10 PHP
为你总结一些php信息函数
2015/10/21 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
实现PHP搜索加分页
2016/10/12 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
2016/11/30 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
Python中Random和Math模块学习笔记
2015/05/18 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
python中退出多层循环的方法
2018/11/27 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
Django 大文件下载实现过程解析
2019/08/01 Python
py-charm延长试用期限实例
2019/12/22 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
eBay德国站:eBay.de
2017/09/14 全球购物
工作自荐信
2013/12/11 职场文书
心理健康日活动总结
2014/05/08 职场文书
社区创先争优承诺书
2014/08/30 职场文书
上课迟到检讨书
2015/05/06 职场文书
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android