截取指定长度的字符串函数(顶好用,绝不会截错的)

summer419 2003-03-11 12:45:27
我自己想出来的方法,自己写的函数,没有经过时间的考验的,哈哈

详细地址:http://web.scuec.edu.cn/~game002/summer/bbs/html/index.php?file=2003.03.11_09.55.10&lm=1/open

原理:
统计出需要截取长度中可见字符的个数,在ASCII表中其16进制值是从
20-7E

用ord()函数,即取ord(" ")~ord("~")之间的都为可以见的字符

一个汉字是有两个不可见字符组成,都不在ASCii表的可见字符内
统计出的可见字符为奇数,则截取奇数个字符组成串
若为偶数,则截取偶数个字符组成串~~

基本上就可以实现字符串截取的时候不出现错截了

function oushu($value) {//判断奇偶数
if($value/2==ceil($value/2)) {
return true;
}
else {
return false;
}
}

function visiblechar($value) {//如果字符的ascii码在空格和~符号以内则为可见
if(ord($value)>=ord(" ")&&ord($value)<=ord("~")) {
return true;
}
else {
return false;
}
}

function shortstring($code,$len) {//截取,在这里我们所设置的$len必须为偶数
$j=0;
$str=strtok($code,"");
if($len>=strlen($code)) {
return $code;
}
for($i=0;$i<$len;$i++) {//计算截取长度以内的可见字符个数
if($this->visiblechar($str[$i])) {
$j++;
}
}
if($this->oushu($j)) {
return substr($code,0,$len).'...';
}
else {
return substr($code,0,$len-1).'...';
}

}
...全文
208 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
summer419 2003-04-13
  • 打赏
  • 举报
回复
原理:国标码的编码机内码为161到255,即A0到FF
这是个好东西,哈哈
fluke 2003-04-13
  • 打赏
  • 举报
回复
看看我截取的怎么样?
http://sfcube.cxc.cc/index.php
用的不是你的方法
jenkin 2003-04-13
  • 打赏
  • 举报
回复
pig
MeE 2003-04-12
  • 打赏
  • 举报
回复
好吧 UP一下
vitalgg 2003-04-11
  • 打赏
  • 举报
回复
这样的函数太多了,早就不稀罕了
下面的是我写的.用着也方便,只要会用substr(),就会用它.
<?php
/*************************************
* Name:substr_for_gb2312()
* Version:0.9 GPL
* Class:PHP
* Copyright (c)2003 Zhang Lihua
* http://xingtai.51.net
* E-mail:hy-sys@etang.com
* MSN:netvt@hotmail.com
* ICQ:251630242 QQ:53178217
* Tel:0086-319-3020796
**************************************/
/**********************************************************************
语法: string substr_for_gb2312(string string, int start, int [length]);
返回值: 字符串
用法同substr();
本函数将字符串 string 的第 start 位起的字符串取出 length 个字符。
若 start 为负数,则从字符串尾端算起。
若可省略的参数 length 存在,但为负数,则表示取到倒数第 length 个字符.
该函数只能从开始从截取,如从中间开始,同样需要分析是不是在拆分汉字
原理:国标码的编码机内码为161到255,即A0到FF
***********************************************************************/
function substr_for_gb2312($str,$start,$len=null){
$totlelength = strlen($str);

//特例情况
if ($len == null) $len = $totlelength;
if ($len ==0) return "";
if ($len >= $totlelength && $start == 0 ) return $str;
if ($start > $totlelength) return "";

//分析$start
if ($start < 0 )//$start<0时,转化为$start>0时的定位.
{
if ( abs($start) >= $totlelength ) $start = 0;
else $start = $totlelength - abs($start);
}
//确定起始位置,当起始位拆分某汉字时,返回值包含此汉字.
if ($start > 0)
{
$i = $start-1;

$flag = -1;

while ($i >= 0)
{
if ( ord(substr($str,$i,1)) > 160)
{
$flag = -1*$flag;
}
else break;
$i--;
}
if($flag==1)
{
$start = $start - 1;
$len++; //保证不位移.
}
}

$str = substr($str,$start);//截除字符串$str的$start位前的字符
$totlelength = strlen($str);

//确定结束位置,当结束位拆分某汉字时,返回值不包含此汉字.
if ($len<0) $len = $totlelength - abs($len);
if ($len <= 0) return "";
$i=min($len,$totlelength);
$i--;
$flag = -1;
while ($i >= 0){
if (ord(substr($str,$i,1))>160){
$flag=-1*$flag;
}else break;
$i--;
}
if($flag == 1)$len=$len-1;
$subit=substr($str,0,$len);
return $subit;
}

?>
summer419 2003-04-11
  • 打赏
  • 举报
回复
我自己顶
swordz 2003-04-11
  • 打赏
  • 举报
回复
PHP里不是有这样的API吗?

string mb_substr ( string str, int start [, int length [, string encoding]])


mb_substr() returns the portion of str specified by the start and length parameters.
summer419 2003-03-11
  • 打赏
  • 举报
回复
为什么我写的函数都没有人光顾呢,,

没有分的帖子就没有人看,,真是的,,

可是好东西哦,也许你们有了??

去看看我的吧,,555555
summer419 2003-03-11
  • 打赏
  • 举报
回复
喜欢的朋友就拿去用啊,不要忘记顶顶我的帖子哦

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧