仓酷云
标题:
PHP网站制作之PHP截取中文字符串的成绩
[打印本页]
作者:
逍遥一派
时间:
2015-2-4 00:11
标题:
PHP网站制作之PHP截取中文字符串的成绩
开发相册系统过程中就有过这样的问题,因为没有交流好,出现重复工作问题,因为文档没有详细的说明而经常临时问对方。成绩|中文|字符串
以下代码试用于GB2312编码,截取中文字符串是PHP中一个头疼的成绩,处理办法是依据值是不是大于等于128来判别是不是是双字节字符,以免呈现乱码的情形。但中英文夹杂、特别符号等成绩老是存在,如今写一个对照周全的,仅供参考:
法式申明:
1. len 参数以中文字符为尺度,1len等于2个英文字符,为了模式上悦目些
2. 假如将magic参数设为false,则中文和英文比量齐观,取相对的字符数
3. 出格合用于用htmlspecialchars()停止过编码的字符串
4. 能准确处置GB2312中实体字符形式()
法式代码:
function FSubstr($title,$start,$len="",$magic=true)
{
/**
* powered by Smartpig
* mailto:d.einstein@263.net
*/
$length = 0;
if($len == "") $len = strlen($title);
//判别肇端为不准确地位
if($start > 0)
{
$cnum = 0;
for($i=0;$i<$start;$i++)
{
if(ord(substr($title,$i,1)) >= 128) $cnum ++;
}
if($cnum%2 != 0) $start--;
unset($cnum);
}
if(strlen($title)<=$len) return substr($title,$start,$len);
$alen = 0;
$blen = 0;
$realnum = 0;
for($i=$start;$i<strlen($title);$i++)
{
$ctype = 0;
$cstep = 0;
$cur = substr($title,$i,1);
if($cur == "&")
{
if(substr($title,$i,4) == "<")
{
$cstep = 4;
$length += 4;
$i += 3;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,4) == ">")
{
$cstep = 4;
$length += 4;
$i += 3;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,5) == "&")
{
$cstep = 5;
$length += 5;
$i += 4;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,6) == """)
{
$cstep = 6;
$length += 6;
$i += 5;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,6) == "'")
{
$cstep = 6;
$length += 6;
$i += 5;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(preg_match("/&#(\d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}
}else{
if(ord($cur)>=128)
{
$cstep = 2;
$length += 2;
$i += 1;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}else{
$cstep = 1;
$length +=1;
$realnum ++;
if($magic)
{
if(ord($cur) >= 65 && ord($cur) <= 90)
{
$blen++;
}else{
$alen++;
}
}
}
}
if($magic)
{
if(($blen*2+$alen) == ($len*2)) break;
if(($blen*2+$alen) == ($len*2+1))
{
if($ctype == 1)
{
$length -= $cstep;
break;
}else{
break;
}
}
}else{
if($realnum == $len) break;
}
}
unset($cur);
unset($alen);
unset($blen);
unset($realnum);
unset($ctype);
unset($cstep);
return substr($title,$start,$length);
}
呵呵,一会儿把UTF-8编码下的代码也贴出来
一些真正的强人总会搞出新玩意来丢给你,你不学就落后了,也印证了前人的经验,果然是学无止境啊!
作者:
山那边是海
时间:
2015-2-4 09:52
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者:
分手快乐
时间:
2015-2-7 19:41
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者:
乐观
时间:
2015-2-13 01:50
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者:
金色的骷髅
时间:
2015-2-13 21:20
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者:
再见西城
时间:
2015-2-23 02:59
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者:
小女巫
时间:
2015-2-26 20:46
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者:
再现理想
时间:
2015-3-7 00:09
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者:
简单生活
时间:
2015-3-7 04:09
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
作者:
谁可相欹
时间:
2015-3-10 13:10
爱上php,他也会爱上你。
作者:
飘灵儿
时间:
2015-3-12 21:12
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者:
仓酷云
时间:
2015-3-20 02:35
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
作者:
因胸联盟
时间:
2015-3-22 05:06
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者:
灵魂腐蚀
时间:
2015-3-27 16:10
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者:
不帅
时间:
2015-3-31 05:25
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者:
透明
时间:
2015-4-6 22:10
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者:
兰色精灵
时间:
2015-4-22 02:12
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者:
爱飞
时间:
2015-5-4 11:01
兴趣是最好的老师,百度是最好的词典。
作者:
admin
时间:
2015-5-4 18:10
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者:
莫相离
时间:
2015-5-12 00:42
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者:
只想知道
时间:
2015-5-12 01:30
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2