php 几个比较实用的函数

张映 发表于 2012-07-08

分类目录: php

标签:,

最近在看代码,发现以下是几个比较实用的函数。

1,取客户端IP

function getOnlineIp() {
    $strOnlineIp = "";
    if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $onlineip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $onlineip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $onlineip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $onlineip = $_SERVER['REMOTE_ADDR'];
    }
    preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches);
    $strOnlineIp = $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown';
    return $strOnlineIp;
}

这里,如果使用多级代理的用户,真实IP是取不到的。

2,字符串截取,支持中文

function getStrTruncate($string, $length = 80, $etc = ''){
    if ($length == 0) return '';
    mb_internal_encoding("UTF-8");

    $string = str_replace("\n","",$string);
    $strlen = mb_strwidth($string);
    if ($strlen > $length) {
        $etclen = mb_strwidth($etc);
        $length = $length - $etclen;
        $str=''; $n = 0;
        for($i=0; $i<$length; $i++) {
            $c = mb_substr($string, $i, 1);
            $n += mb_strwidth($c);
            if ($n>$length) { break; }
            $str .= $c;
        }
        return $str.$etc;
    } else {
        return $string;
    }
}

echo getStrTruncate("海底苍鹰博客",7);  //结果是海底苍,utf8一个汉字对应二个字符

3,多长时间前的时间函数,论坛,博客常用

function timeFromNow($dateline) {
    if(empty($dateline)) return false;
    $seconds = time() - $dateline;
    if ($seconds < 60){
        return "1分钟前";
    }elseif($seconds < 3600){
        return floor($seconds/60)."分钟前";
    }elseif($seconds  < 24*3600){
        return floor($seconds/3600)."小时前";
    }elseif($seconds < 48*3600){
        return date("昨天 H:i", $dateline)."";
    }else{
        return date('Y-m-d', $dateline);
    }
}

echo timeFromNow(strtotime("2012-07-07 14:15:13")); //昨天 14:15
echo timeFromNow(strtotime("2012-07-08 14:15:13")); //1小前

4,过滤部分标签

function delTags($str)
{
    $farr = array(
    "/<(\/?)(script|i?frame|style|html|body|title|link|meta|form|input|embed|object|textarea|\?|\%)([^>]*?)>/isU",
    "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU"
    );
    $tarr = array(
    "",
    ""
    );
    $str = preg_replace( $farr,$tarr,$str);
    return $str;
}

$str = "<a href='#'>asdfasdfsd</a>====<script>alert(1111)</script>";
echo delTags($str);    //结果:<a href='#'>asdfasdfsd</a>====alert(1111)
echo strip_tags($str); //结果:sdfasdfsd====alert(1111)

如果要过滤所有标签strip_tags就够用了。



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/php/1427.html

2 条评论

  1. 插件吧 留言

    4,过滤部分标签 function delTags($str)

    这个函数还不够安全,一些 “标签的属性” 也需要过滤,不然,容易引起XSS攻击~~~

  2. xiao 留言

    第一个完全是dz的代码
    第二个可以用mb_strimwidth