php函数 - 单位时间内字符串加密解密

此函数可在指定时间内,加密还原字符串,超时无法还原。

用途如:单点登录的token加密传输,临时密码等等

 

 

<?php

/**

 * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE

 * @param string $key 密钥

 * @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效

 * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文

 *

 * @example

 *

 * $a = authcode('abc', 'ENCODE', 'key');

 * $b = authcode($a, 'DECODE', 'key'); // $b(abc)

 *

 * $a = authcode('abc', 'ENCODE', 'key', 3600);

 * $b = authcode('abc', 'DECODE', 'key'); // 在一个小时内,$b(abc),否则 $b 为空

*/

 

function authcode($string, $operation = 'DECODE', $key = '', $expiry = 3600) {

 

$ckey_length = 4;

// 随机密钥长度 取值 0-32;

// 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。

// 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方

// 当此值为 0 时,则不产生随机密钥

 

$key = md5($key ? $key : EABAX::getAppInf('KEY'));

$keya = md5(substr($key, 0, 16));

$keyb = md5(substr($key, 16, 16));

$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';

 

$cryptkey = $keya.md5($keya.$keyc);

$key_length = strlen($cryptkey);

 

$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;

$string_length = strlen($string);

 

$result = '';

$box = range(0, 255);

 

$rndkey = array();

for($i = 0; $i <= 255; $i++) {

$rndkey[$i] = ord($cryptkey[$i % $key_length]);

}

 

for($j = $i = 0; $i < 256; $i++) {

$j = ($j + $box[$i] + $rndkey[$i]) % 256;

$tmp = $box[$i];

$box[$i] = $box[$j];

$box[$j] = $tmp;

}

 

for($a = $j = $i = 0; $i < $string_length; $i++) {

$a = ($a + 1) % 256;

$j = ($j + $box[$a]) % 256;

$tmp = $box[$a];

$box[$a] = $box[$j];

$box[$j] = $tmp;

$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));

}

 

if($operation == 'DECODE') {

if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {

return substr($result, 26);

} else {

return '';

}

} else {

return $keyc.str_replace('=', '', base64_encode($result));

}

 

}

 

?>

php利用crypt函数加密和解密

// +----------------------------------------------------------------------+
// | Wiki Framework |
// +----------------------------------------------------------------------+
// $string 明文 或 密文 必填
// $isEncrypt 是否加密 可选,默认为加密
// $key 密匙 可选,默认为空格
// $b = dencrypt($a,TRUE,'123'); 
// $c = dencrypt($b,false,'123');
// 采用SHA1生成密匙簿,超过300个字符使用ZLIB压缩
function dencrypt($string, $isEncrypt = true, $key = KEY_SPACE) {
    if (!isset($string{0}) || !isset($key{0})) {
        return false;
    }
    $dynKey = $isEncrypt ? hash('sha1', microtime(true)) : substr($string, 0, 40);
    $fixedKey = hash('sha1', $key);
    $dynKeyPart1 = substr($dynKey, 0, 20);
    $dynKeyPart2 = substr($dynKey, 20);
    $fixedKeyPart1 = substr($fixedKey, 0, 20);
    $fixedKeyPart2 = substr($fixedKey, 20);
    $key = hash('sha1', $dynKeyPart1 . $fixedKeyPart1 . $dynKeyPart2 . $fixedKeyPart2);
    $string = $isEncrypt ? $fixedKeyPart1 . $string . $dynKeyPart2 : (isset($string{339}) ? gzuncompress(base64_decode(substr($string, 40))) : base64_decode(substr($string, 40)));
    $n = 0;
    $result = '';
    $len = strlen($string);
    for ($n = 0; $n < $len; $n++) {
        $result .= chr(ord($string{$n}) ^ ord($key{$n % 40}));
    }
    return $isEncrypt ? $dynKey . str_replace('=', '', base64_encode($n > 299 ? gzcompress($result) : $result)) : substr($result, 20, -20);
}

PHP文件缓存数据类

点击查看

php正则表达式

1 理解正则表达式


正则表达式是一种可以用于模式匹配的强大工具。简单地说,正则表达式就是一套规则,用于判定其他的元素是否符合它。


举一个简单的例子:在一个用户注册的页面中(例如,一个论坛或者交友网站的注册页面),上面可能有“电子邮件”这一项需要填写。对系统来说,需要判定用户所填写的电子邮件地址是否合法,即是否符合电子邮件地址的规则。利用字符串操作技术可以实现这个功能。


<!--检查电子邮件合法性:validate_email1.php-->
<?php

function validate_email1($email){

    $hasAtSymbol = strpos($email, "@");    //检查是否包含@

    //strpos($mystring,$findme);在$mystring中查找是否存在$findme,有则返回位置,否则返回false;

    $hasDot = strpos($email, ".");         //检查是否包含.

    if($hasAtSymbol && $hasDot && $hasAtSymbol<$hasDot )

        return 1;

    else

        return 0;

}

    echo validate_email1("chen@sjolzy.cn");       //true

    echo validate_email1(chen@sjolzy);             //false

?>

上面代码实现了一个函数validate_email1(),使用字符串操作中的定位字符函数,判断一个字符串是否是一个合法的电子邮件地址的规则。仔细考虑实现的功能,实际上是在判断一个字符串是否具有一定的模式,或者说是否满足一定的规则。在这种情况下,可以使用正则表达式来实现相同的功能。


<!--使用正则表达式检查电子邮件合法性:validate_email2.php-->
<?php

    function validate_email2($email){

        return (int)ereg("^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$", $email);

    }

    echo validate_email2(chen@sjolzy.cn);          //true

    echo validate_email2(chen@sjolzy);        //false

?>

上面实现了具有相同功能的函数validate_email1(),函数使用了一个正则表达式的函数ereg() :以区分大小写的方式在 string 中寻找与给定的正则表达式 pattern 所匹配的子串。观察ereg()函数的参数“^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$”,容易看出其实际上表示满足这样规则的字符串:以[a-zA-Z]即任意大小写字符串开头,然后紧跟“@”,然后又是任意大小写字母组成的字符串,第4部分是符号“.”,最后仍是任意字符串。这相当于定义了一个字符串的组成规则。


在看过这个示例后,重新来看正则表达式的定义:正则表达式是一种可以用于模式匹配的强大工具。


 2 使用正则表达式


在PHP有6个函数来处理正则表达式,检查一个字符串是否满足一个的规则。它们都把一个正则表达式作为它们的第一个参数,语法如下。


    bool ereg(string pattern, string string [, array regs]):最常用的正则表达式函数, 搜索跟正则表达式pattern匹配的一个字符串。区分大小写。搜索到返回true,否则返回false。
 

     string ereg_replace(string pattern, string replacement, string string):搜索跟正则表达式pattern匹配的一个字符串,并用新的字符串代替所有这个表达式出现的地方。


     bool eregi(string pattern, string string [, array regs]):搜索跟正则表达式pattern匹配的一个字符串。不区分大小写。搜索到返回true,否则返回false。


     string eregi_replace(string pattern, string replacement, string string):和ereg_replace有着一样的搜索-替换功能,不过忽略大小写


     arraysplit(string pattern, string string [, int limit]):搜索和正则表达式匹配的字符串,区分大小写并且以字符串集合的方式返回匹配结果。


     arrayspliti(string pattern, string string [, int limit]):搜索和正则表达式匹配的字符串,不区分大小写,并且以字符串集合的方式返回匹配结果。

    介绍了PHP的正则表达式函数及其功能。要了解它们的具体使用方法,则要首先了解正则表达式的构造。


3 构造正则表达式:


    如前所述,在匹配一个字符串到正则表达式之前,必须先构造正则表达式。

    1).定义头部规则
   SPHP用“^”定义字符串头部的规则,例如:“^hello”即定义头部为“hello”的字符串,结合上一节所介绍的函数,代码<?php echo ereg("^hello", "hello world!"); ?>    //true将返回“true”,因为待验证的字符串“hello word!”满足规则:以“hello”开头。而<?php echo ereg("^hello", "i say hello world"); ?>    //false将返回 false,因为hello不在字符串”I say hello world”的头部。

    2).定义尾部规则
    <?PHP用“$”定义字符串尾的规则,例如:“world$”即定义尾部为“world”的字符串,代码

    <?php echo ereg("world$", "hello world!"); ?>        //true

    将返回“true”,因为待验证的字符串“hello word!”满足规则:以“world”结尾。而

    <?php echo ereg("world$", "i say hello php"); ?>    //false

    将返回 false,因为world不在字符串”I say hello     php”的尾部。

    3).定义包含任意字符规则$ 
    PHP用“.”定义包含任意字符的规则,例如:“.”即定义包含任意字符的字符串,代码

    <?php echo ereg(".", "something"); ?>        //true

    将返回“true”,因为待验证的字符串“something”满足规则:包含任意字符。而

    <?php echo ereg(".", ""); ?>                //false

    将返回 false,因为空串不包含任意字符。

    4).定义包含字符数目规则
    使用大括号“{n}”定义包含n个任意字符,“{m,n}”定义包含m到n范围内的任意字符。

    例如“.{3}”定义包含或超过3个连续任意字符的字符串,“.{1,3}”定义包含1到3个字符的字符串。代码

    <?php echo ereg(".{3}", "abcd"); ?>        //true
    <?php echo ereg(".{1,3}", "aa"); ?>        //true

    都将返回“true”,因为待验证的字符串“aaa”满足规则:包含3个字符。而

    <?php echo ereg(".{4}", "aaa"); ?>        //false

    将返回 false。

    “.”也可以结合“^”和“$”使用,例如“.{3}$”定义了以3个字符结尾的字符串,“^.{3}”定义了以三个连续字符开头的字符串。代码

    <?php echo ereg(".{3}$", "baaa"); ?>        //true

    将返回“true”,因为待验证的字符串“baaa”满足规则:以3个连续字符结尾。而

    <?php echo ereg(".{3}$", "ab"); ?>          //false

    将返回 false。)

    5).定义包含0~n个字符规则
    PHP用“*”定义包含0~n个字符的规则,例如:“a*”即定义包含0~n个字符的字符串,代码

    <?php echo ereg("a*", "aaa"); ?>        //true

    将返回“true”,因为待验证的字符串“aaa”满足规则:包含0~n个字符“a”。而

    <?php echo ereg("a*", "bbb"); ?>        //true

    也将返回 true,因为待验证的字符串“bbb”也满足规则:包含0~n个字符“a”。

    6).定义包含1~n个字符规则
    PHP用“+”定义包含1~n个字符的规则,例如:“a+”即定义包含1~n个字符“a”的字符串,代码

    <?php echo ereg("a+", "aaa"); ?>        //true

    将返回“true”,因为待验证的字符串“aaa”满足规则:包含1~n个字符“a”。而

    <?php echo ereg("a+", "bbb"); ?>        //false

    将返回 false,因为待验证的字符串“bbb”不满足规则:包含1~n个字符“a”。

    *7).定义包含0或1个字符规则
    PHP用“?”定义包含0或1个字符的规则,例如:“a?”即定义包含0或1个字符“a”的字符串,代码

    <?php echo ereg("a?", "a"); ?>        //true
    <?php echo ereg("a?", "bb"); ?>       //true

    将返回“true”,因为待验证的字符串“a”和“bb”都满足规则:包含0或1个字符“a”。而

    <?php echo ereg("a?", "aa"); ?>    //true

   //(有错) 将返回false,因为待验证的字符串“bbb”不满足规则:包含0或1个字符“a”。

    8).定义包含某范围的字符规则
    PHP用方括号“[start-end]”定义包含start-end范围内任意字符的规则,例如:“[a-z]”即定义包含a到z范围内任意字符的字符串,代码

    <?php echo ereg("^[a-z]+$", "abc"); ?>    //true

    将返回“true”,因为待验证的字符串“abc”满足规则:包含1~n个字符a~z范围内任意字符。

    <?php echo ereg("^[a-z]+$", "ABC"); ?>    //false

    将返回 false,因为待验证的字符串“ABC”不满足规则:包含1~n个字符“a”。

    9).定义包含某范围的词规则
    PHP用圆括号“(word1|word2|…)”定义包含word1、word2、…的任意字符串的规则,例如:“(wang|zhang)”即定义包含“wang”或“zhang”的任意字符的字符串,代码

    <?php echo ereg("^(wang|zhang)+$", "wang and zhang"); ?>    //true

    将返回“true”,因为待验证的字符串“wang and zhang”满足规则:以“wang”或“zhang”开头。

    <?php echo ereg("^(wang|zhang)+$", "shi and jing"); ?>        //false

    将返回 false,因为待验证的字符串“shi and jing”不满足规则:以“wang”或“zhang”开头。

    10).空格字符的处理
    空格字符可以简单的处理为普通字符“ ”,但在实际使用中常用“[[:space]]”来代替,这样在字符串中更加易读。例如:“I[[:space]]am”表示为“I am”。

    11).特殊字符的处理
    因为一些字符要用在一个正则表达式语法上,像(wang|zhang)中的圆括号,需要屏蔽掉这些字符,使之成为字符串的一部分,而不是具有功能性的表达式的一部分。用转义字符,即反斜杠“\”可以实现这种转换,例如:

    <?php echo ereg("^[a-zA-z]+\|[a-zA-z]+$", "wang|zhang"); ?>

    在正则表达式中,需要转义的字符包括:^, $, (, ), ., [, |, *, ?, +, \ and {。

    本节全面的介绍了如何构造一个正则表达式,即如何定义一个字符串组成规则。下一节,将给出一系列例子,通过例子,将进一步熟悉上述规则构造方法。

4 示例1验证


    本小节实现利用PHP正则表达式验证URL合法性的示例。一个合法的URL如:

    <a href="//sjolzy.cn" target="_blank">sjolzy.cn</a>

    其构造规则为:[协议]://[www].[域名].[com|net|org…]

    根据上一小节的构造正则表达式,可以构造下面的规则。

    "^http://(www\ .)?.+\ .(com|net|org)$"    

    其中,"^http://”定义能匹配规则的字符串开头是"http://";"(www\ .)?"表示随后应该是0-1个“www”;而“.+”表示任意字符串;然后是一个“.”,转义字符“\”表明其仅仅是一个字符;最后的“(com|net|org)$”表明以com、net、org中其中一个结尾,此处,只列出这3种情况。完成验证URL合法性的函数如下所示。

    <!--使用正则表达式检查URL合法性:validate_url.php-->

    <?php

        function isValidDomain($domainName)

        {

            return(int)ereg("^(http|ftp)://(www\.)?.+\.(com|net|org)$",$domainName);

        }

        echo isValidDomain(http://www.sjolzy.cn);    //1

        echo isValidDomain("//sjolzy.com");    //1

        echo isValidDomain("http://www.sjolzy.fr");    //0

        echo isValidDomain("www.sjolzy.com");    //0

    ?>

5 示例2验证电话号码

    本小节实现利用PHP正则表达式验证北京市电话号码合法性的的示例。合法的号码如:+86 010xxxxxxxx,其构造规则为:[+86] [010][八位数字]。

    根据上一小节的构造正则表达式,可以构造下面的规则。

    “^\+86[[:space:]]010[0-9]{8}$

    其中,“^\+86”定义能匹配规则的字符串开头是“+86”;“[[:space:]]”表示随后1个空格;而“[0-9]{8}$”表明以8个数字结尾。
    完成验证北京市电话号码合法性的函数如下所示。

    <!--使用正则表达式检查北京电话号码合法性:validate_phone.php-->

    <?php

        function isValidPhone($phoneNum)

        {

            echo (int)ereg("^\+86[[:space:]]010[0-9]{8}$", $phoneNum);

        }

        echo isValidPhone("+86 01012345678");          //1

        echo isValidPhone("+86 010123456789");        //0

        echo isValidPhone("+86 0101234567a");          //0

    ?>