当前位置:  编程技术>php
本页文章导读:
    ▪php中文字符串截断且无乱码的解决方法      php中文字符串截断且无乱码的解决方法,有需要的朋友可以参考下。 一个比较好用的字符串截取函数:   代码如下: <?php function substring($str, $start, $length){ //比较好用字符串截取函数 $len =.........
    ▪php和js实现转换文件大小为人性化可读的方式      php和js实现转换文件大小为人性化可读的方式,即显示为“XXXGB”或“XXXMB”的方式。 一、先来看php的实现代码   代码如下: <?php function my_formatSize($size){ $size  = doubleval($size); $rank =0; $rank.........
    ▪php正则表达式匹配URL中的域名      在PHP的官网上看到parse_url()函数的替代,其结果和parse_url()函数差不多,是使用正则实现的,看到好就转过来。 原文请参考:http://www.php.net/parse_url#104958 这里就不翻译了,它可以解析URI。 URI .........

[1]php中文字符串截断且无乱码的解决方法
    来源: 互联网  发布时间: 2013-12-24

php中文字符串截断且无乱码的解决方法,有需要的朋友可以参考下。

一个比较好用的字符串截取函数:
 

代码如下:
<?php
function substring($str, $start, $length){ //比较好用字符串截取函数
$len = $length;
if($length < 0){
    $str = strrev($str);
    $len = -$length;
}
$len= ($len < strlen($str)) ? $len : strlen($str);
$tmpstr = "";
for ($i= $start; $i < $len; $i ++)
{
    if (ord(substr($str, $i, 1)) > 0xa0)
    {
       $tmpstr .= substr($str, $i, 2);
       $i++;
    } else {
       $tmpstr .= substr($str, $i, 1);
    }
}
if($length < 0) $tmpstr = strrev($tmpstr);
return $tmpstr;
}
?>

使用方法示例:
 

代码如下:

<?php
$str1 = '我是一串比较长的中文不带英文';
$str2 = '我是一串比较长的中文带yingwen';

$len = strlen($str1);
echo '<br />'.$len;  //return 28

$len = strlen($str2);
echo '<br />'.$len;  //return 29

echo '<br />';   
echo substring($str1, 0, 11);   
echo '<br />';
echo substring($str2, 0, 11);       
echo '<br />';
echo substring($str1, 16, 28);   
echo '<br />';
echo substring($str2, 16, 29);   
?>
 

结果显示:
28
29
我是一串比较
我是一串比较
中文不带英文
中文带yingwen

这个函数十分有用,比如用来截断比较长的文件名,但是要在中间加上...,可以这样来做:
 

代码如下:
<?php
function formatName($str, $size){
    $len = strlen($str);
    if(strlen($str) > $size) {
        $part1 = substring($str, 0, $size / 2);
        $part2 = substring($str, $len - ($size/2), $len);
        return $part1 . "..." . $part2;
    } else {
        return $str;
    }
}
?>
 

另外,网上看到一种超级简单的中文截断解决方案,经测试,效果很不错:
 

代码如下:
<?php
echo substr($str1,0,10).chr(0);
?>
 

原理解释:
chr(0)不是null
null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000
虽然chr(0)不会显示出什么,但是他是一个字符。
当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空”
根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了

20120705更新:
以上方法虽好,但是偶尔还是会碰到乱码,原因未深究。不过可以用以下的方法,对UTF8字符文本屡试不爽。
注意:该方法中将汉字计算为1单位长度,英文一个字母1单位长度,所以截断时需要注意长度设置。
计算长度的方法:
 

代码如下:

<?php
function strlen_UTF8($str)
{
    $len = strlen($str);
    $n = 0;
    for($i = 0; $i < $len; $i++) {
        $x = substr($str, $i, 1);
        $a  = base_convert(ord($x), 10, 2);
        $a = substr('00000000'.$a, -8);
        if (substr($a, 0, 1) == 0) {
        }elseif (substr($a, 0, 3) == 110) {
            $i += 1;
        }elseif (substr($a, 0, 4) == 1110) {
            $i += 2;
        }
        $n++;
    }
    return $n;
} // End strlen_UTF8;

///字符串截断函数:
function subString_UTF8($str, $start, $lenth)
{
        $len = strlen($str);
        $r = array();
        $n = 0;
        $m = 0;
        for($i = 0; $i < $len; $i++) {
            $x = substr($str, $i, 1);
            $a  = base_convert(ord($x), 10, 2);
            $a = substr('00000000'.$a, -8);
            if ($n < $start){
                if (substr($a, 0, 1) == 0) {
                }elseif (substr($a, 0, 3) == 110) {
                    $i += 1;
                }elseif (substr($a, 0, 4) == 1110) {
                    $i += 2;
                }
                $n++;
            }else{
                if (substr($a, 0, 1) == 0) {
                    $r[ ] = substr($str, $i, 1);
                }elseif (substr($a, 0, 3) == 110) {
                    $r[ ] = substr($str, $i, 2);
                    $i += 1;
                }elseif (substr($a, 0, 4) == 1110) {
                    $r[ ] = substr($str, $i, 3);
                    $i += 2;
                }else{
                    $r[ ] = '';
                }
                if (++$m >= $lenth){
                    break;
                }
            }
        }
        return join($r);
    } // End subString_UTF8;

//使用方法和之前介绍的一样,比如formatName可以实现如下(这对汉字长度做了小优化):
function formatName($str, $size){
    $len = strlen_UTF8($str);
    $one_len = strlen($str);
    $size = $size * 1.5 * $len / ($one_len);
    if(strlen_UTF8($str) > $size) {
        $part1 = subString_UTF8($str, 0, $size / 2);
        $part2 = subString_UTF8($str, $len - ($size/2), $len);
        return $part1 . "..." . $part2;
    } else {
        return $str;
    }
}
?>

您可能感兴趣的文章:
php函数substr截取中文字符出现乱码的解决方法
php substr截断中文半个汉字乱码问题的解决方法
php乱码问题 utf8乱码杂谈
php截取中文字符串乱码如何解决呢
php分割GBK中文乱码的解决方法
解决php截取utf-8中文字符串时乱码的问题
如何解决php中文字符乱码,中文字符入库乱码的问题
有关php中文乱码的解决方法
php utf8 一半乱码的问题


    
[2]php和js实现转换文件大小为人性化可读的方式
    来源: 互联网  发布时间: 2013-12-24

php和js实现转换文件大小为人性化可读的方式,即显示为“XXXGB”或“XXXMB”的方式。

一、先来看php的实现代码
 

代码如下:
<?php
function my_formatSize($size){
$size  = doubleval($size);
$rank =0;
$rankchar ='Bytes';
while($size>1024){
    $size = $size/1024;
    $rank++;
}
if($rank==1){
    $rankchar="KB";
}
else if($rank==2){
    $rankchar="MB";
}
else if($rank==3){
    $rankchar="GB";
}
$size = number_format($size, 2, '.', '');
return  "".$size." ".$rankchar;
}

二、js实现代码
 

代码如下:
<?php
function my_formatSize($size){
    var size  = parseFloat($size);
    var rank =0;
    var rankchar ='Bytes';
    while(size>1024){
size = size/1024;
rank++;
    }
    if(rank==1){
rankchar="KB";
    }
    else if(rank==2){
rankchar="MB";
    }
    else if(rank==3){
rankchar="GB";
    }   
    return size.toFixed(2)+ " "+ rankchar;
}
?>

注:代码中保留2位小数。


    
[3]php正则表达式匹配URL中的域名
    来源: 互联网  发布时间: 2013-12-24

在PHP的官网上看到parse_url()函数的替代,其结果和parse_url()函数差不多,是使用正则实现的,看到好就转过来。

原文请参考:http://www.php.net/parse_url#104958

这里就不翻译了,它可以解析URI。
URI 是 Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通用资源标志符(Uniform Resource Identifier, 简称"URI")进行定位。

对就分组:
      ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
       12            3  4          5       6  7        8 9

PHP 测试:

代码如下:

<?php
$search = '~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~i';
$url = 'http://www.php.net/pub/ietf/uri/#Related';
$url = trim($url);
preg_match_all($search, $url ,$rr);
printf("<p>输出URL数据为:</p><pre>%s</pre>\n",var_export( $rr ,TRUE));

/*
各分组如下
      $1 = http:
      $2 = http
      $3 = //www.php.net
      $4 = www.php.net
      $5 = /pub/ietf/uri/
      $6 = <undefined>
      $7 = <undefined>
      $8 = #Related
      $9 = Related
*/
?>

这里提供另一个简洁的代码:

代码如下:
<?php
// 从 URL 中取得主机名
preg_match("/^(http:\/\/)?([^\/]+)/i", "http://www.php.net/index.html", $matches);
$host = $matches[2];
// 从主机名中取得后面两段
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>

执行后输出:domain name is: php.net

您可能感兴趣的文章:
php匹配图片地址的代码一例
PHP正则匹配日期和时间(时间戳转换)的例子
php匹配任何网址的正则表达式
php正则匹配重写html图片img路径的代码一例
PHP正则匹配获取URL中域名的代码
使用 preg_replace 函数 匹配图片并加上链接的方法
php用preg_match_all匹配文章中的图片


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
数据库 iis7站长之家
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3