搜房代码学习

基础的公共类:

php写接口

1.入口index.php

require '../../include/inc.php';//查看 http://www.cnblogs.com/xia520pi/p/3697099.html  知晓require 和include的区别

d72051ebb54122b90e09b5b98fbeff3f

//设置最大使用内存数量

ini_set('memory_limit', '512M');//   

ini_set('display_errors', true);

5c2dfe29c063f11a0ea572946e6ab10b

$_GET = array_map('strip_tags', $_GET);//

array_map — 将回调函数作用到给定数组的单元上

说明

array array_map ( callable $callback , array $arr1 [, array $... ] )

array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

string strip_tags ( string $str [, string $allowable_tags ] )

该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。<?php

$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';

echo strip_tags($text);

echo "\n";

// 允许 <p> 和 <a>

echo strip_tags($text, '<p><a>');

?>

以上例程会输出:

Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a>

2:inc.php文件

int error_reporting ([ int $level ] )

error_reporting() 函数能够在运行时设置 error_reporting 指令。 PHP 有诸多错误级别,使用该函数可以设置在脚本运行时的级别。 如果没有设置可选参数 level, error_reporting() 仅会返回当前的错误报告级别

<?php

// 关闭所有PHP错误报告

error_reporting(0);

// Report simple running errors

error_reporting(E_ERROR | E_WARNING | E_PARSE);

// 报告 E_NOTICE也挺好 (报告未初始化的变量

// 或者捕获变量名的错误拼写)

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// 除了 E_NOTICE,报告其他所有错误

// 这是在 php.ini 里的默认设置

error_reporting(E_ALL ^ E_NOTICE);

// 报告所有 PHP 错误 (参见 changelog)

error_reporting(E_ALL);

// 报告所有 PHP 错误

error_reporting(-1);

// 和 error_reporting(E_ALL); 一样

ini_set('error_reporting', E_ALL);

error_reporting(E_ALL ^ E_NOTICE);//显示除去 E_NOTICE 之外的所有错误信息

error_reporting(E_ALL^E_WARNING^E_NOTICE);//显示除去E_WARNING E_NOTICE 之外的所有错误信息

?>

spl_autoload_register 见笔记

ucfirst() ,file_exists(),class_exists(),method_exists()

3:func.php文件

//$result 是最原始的xml数据

$resultchange = str_ireplace('<?xml version="1.0" encoding="gb2312" ?>', "<?xml version='1.0' encoding='utf-8' ?>", $result);

//把&替换为两个不可见的全角空格,使用的时候替换回去,防止出现残缺的html标签,导致不可过滤或者是显示不正常

$resultchange = str_replace('&', "  ", $resultchange);

$resultchange = iconv("gbk", "utf-8//IGNORE", $resultchange);

$xmlstr = simplexml_load_string($resultchange);//这个函数可以看一下,不错的一个函数   simplexml_load_string — Interprets a string of XML into an object

// simplexml_load_file — Interprets an XML file into an object

simplexml2Array($xmlstr, 0, 'gbk');//$xmlstr是utf-8格式的

/**

* 把 SimpleXMLElement 对象转换成数组的函数,支持把 utf-8 编码转成别的编码。若不用 $charset 参数,则保持原有的 UTF-8 编码

* @param string/simplexmlobj $xml               符合xml格式的字符串或者为simplexml对象

* @param integer             $attribsAsElements 属性是否作为数组元素输出,默认为 0,不输出

* @param string              $charset           字符集

* @return array

*/

function simplexml2Array($xml, $attribsAsElements = 0, $charset = '')

{

    if (is_object($xml) && get_class($xml) == 'SimpleXMLElement') {

        $attributes = $xml->attributes();

        foreach ($attributes as $k=>$v) {

            if ($v) $a[$k] = (string) $v;

        }

        $x = $xml;

        $xml = get_object_vars($xml);//get_object_vars()查看这个函数http://php.net/manual/zh/function.get-object-vars.php

    }

    if (is_array($xml)) {

        if (count($xml) == 0) return (string) $x; // for CDATA

        foreach ($xml as $key=>$value) {

            //这里递归调用,所以要把 $charset 再传递一下。

            $r[$key] = simplexml2Array($value, $attribsAsElements, $charset);

            if (!is_array($r[$key]) && ('' != $charset)) {

                $r[$key] = iconv('utf-8', $charset.'//IGNORE', $r[$key]);

            }

        }

        if (isset($a)) {

            if ($attribsAsElements) {

                $r = array_merge($a, $r);

            } else {

                $r['@'] = $a; // Attributes

            }

        }

        return $r;

    }

    return (string) $xml;

}

array get_object_vars ( object $object )

Returns an associative array of defined object accessible non-static properties for the specified object in scope. If a property has not been assigned a value, it will be returned with a NULL value.

/**

* 获取客户端IP地址

* @param boolean $pasportlogin 是否是passport登录

* @param boolean $forwarded    是否取HTTP_X_FORWARDED_FOR

* @return string

*/

function Get_Client_ip($pasportlogin = true, $forwarded = false)

{

    if (getenv("HTTP_X_REAL_IP") && strcasecmp(getenv("HTTP_X_REAL_IP"), "unknown") && !$forwarded)

        $ip = getenv("HTTP_X_REAL_IP");

    else if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))

       $ip = getenv("HTTP_CLIENT_IP");

    else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))

        $ip = getenv("HTTP_X_FORWARDED_FOR");

    else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))

        $ip = getenv("REMOTE_ADDR");

    else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))

        $ip = $_SERVER['REMOTE_ADDR'];

    else

        $ip = "unknown";

    if ($pasportlogin === true) {

        if (false !== strpos($ip, ',')) {

            $arrIp = explode(', ', $ip);

            for ($i = 0; $i < count($arrIp); $i++) {

                if (!eregi("^(10|172\.16|192\.168)\.", $arrIp[$i])) {

                    $ip = $arrIp[$i];

                    break;

                }

            }

        }

    }

    return($ip);

}

//string getenv ( string $varname ) Returns the value of the environment variable varname, or FALSE if the environment variable varname does not exist.

int strcasecmp ( string $str1 , string $str2 )Binary safe case-insensitive string comparison.  Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.

/**

* 获取客户端端口地址

*

* @return int/false

*/

function Get_Client_port()

{

    //此字段是运维设置的,由前端逐级向后传递

    if (isset($_SERVER['HTTP_REMOTE_X_PORT']) && $_SERVER['HTTP_REMOTE_X_PORT'] > 0)

        return intval($_SERVER['HTTP_REMOTE_X_PORT']);

    elseif (isset($_SERVER['REMOTE_PORT']) && $_SERVER['REMOTE_PORT'] > 0)

        return intval($_SERVER['REMOTE_PORT']);

    else

        return false;

}

/**

* 获取服务器ip

* @param boolean $ip2long 是否需要ip2long转化

* @return string

*/

function Get_Server_ip($ip2long = false)

{

    $serverip = '';

    if (__IS_WIN__ == 0) {

        //优先获取外网ip

        $line = '/sbin/ifconfig | sed -n -e \'/eth/{N;p}\' | awk \'BEGIN{FS=":"}/inet addr/{print $2}\' | awk \'{print $1}\' | sed \'/192/d\' | head -1';

        $serverip = trim(exec($line));

        //如果为空,再获取内网ip

        if ($serverip == '') {

            $line = '/sbin/ifconfig | sed -n -e \'/eth/{N;p}\' | awk \'BEGIN{FS=":"}/inet addr/{print $2}\' | awk \'{print $1}\' | head -1';

            $serverip = trim(exec($line));

        }

    } else {

        $line = 'ipconfig';

        exec($line, $output);

        $my_reg_expr = "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$";

        foreach ($output as $row) {

            if (false !== strpos($row, 'IP Address')) {

                preg_match('/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/', $row, $matches);

                if (isset($matches[0])) {

                    $serverip = $matches[0];

                    break;

                }

            }

        }

    }

    //如果还没有就给个默认值吧

    if ($serverip == '')

        $serverip = '127.0.0.1';

    if ($ip2long === true)

        return abs(ip2long($serverip));//兼容32位

    else

        return $serverip;

}

/**

* 输出跳转js

* @param string  $str      消息提示

* @param string  $location 地址

* @param boolean $istop    是否停止

* @param boolean $norand   是否不携带随机参数

* @return null

*/

function Display_javascript($str, $location = 'history.back', $istop = false, $norand = false)

{

    header("Cache-Control: max-age=0");

    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');

    header('Cache-Control: post-check=0, pre-check=0', false);

    header('Pragma: no-cache'); //兼容http1.0和https

    echo "<!DOCTYPE HTML><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=gbk\"><script language=\"javascript\">\n";

    if (strlen($str) > 0) {

        echo "alert(\"$str\");\n";

    }

    if ($location == "history.back") {

        echo "window.history.back(-1);\n";

    } elseif ($location == "reload") {

        echo "window.location.reload();\n";

    } elseif ($location == 'close') {

        echo "window.close();\n";

    } else {

        if (!$norand) {

            if (strstr($location, "?") === false) {

                $location .= "?rand=".rand();

            } else {

                $location .= "&rand=".rand();

            }

        }

        if ($istop) {

            echo "parent.document.location.href=\"$location\";\n";

        } else {

            echo "window.location.href=\"$location\";\n";

        }

    }

    echo "</script></head></html>";

    exit();

}

/**

* 兼容新版本的htmlspecialchars

* @param  string $string   字符串

* @param  string $encoding 编码

* @return string

*/

function Htmlspecialchars_For_php54($string, $encoding = 'ISO-8859-1')

{

    if (version_compare(PHP_VERSION, '5.4.0', '<'))//如果php版本小于5.4.0则执行

        return htmlspecialchars($string);

    else

        return htmlspecialchars($string, ENT_COMPAT|ENT_HTML401, $encoding);

}

mixed version_compare ( string $version1 , string $version2 [, string $operator ] )

This parameter is case-sensitive, values should be lowercase.;

return :By default, version_compare() returns -1 if the first version is lower than the second, 0 if they are equal, and 1 if the second is lower.

When using the optional operator argument, the function will return TRUE if the relationship is the one specified by the operator, FALSE otherwise.

string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string$encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )

The translations performed are:

- '&' (ampersand) becomes '&amp;'

- '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.

- "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set.

- '<' (less than) becomes '&lt;'

- '>' (greater than) becomes '&gt;'

ENT_COMPAT

Will convert double-quotes and leave single-quotes alone.

ENT_QUOTES

Will convert both double and single quotes.

ENT_NOQUOTES

Will leave both double and single quotes unconverted.

ENT_HTML401

Handle code as HTML 4.01.

一对可逆字符串的加密与解密

/**

* 可逆的字符串加密函数

* @param int $txtStream 待加密的字符串内容

* @param int $password  加密密码

* @return string 加密后的字符串

*/

function encrystr($txtStream, $password='58al92bl')

{

    //密锁串,不能出现重复字符,内有A-Z,a-z,0-9,/,=,+,_,

    $lockstream = 'st=lDEFABCNOPyzghi_jQRST-UwxkVWXYZabcdef+IJK6/7nopqr89LMmGH012345uv';

    //随机找一个数字,并从密锁串中找到一个密锁值

    $lockLen = strlen($lockstream);

    $lockCount = rand(0, $lockLen-1);

    $randomLock = $lockstream[$lockCount];//根据下标获取字符串中的一个字母

    //结合随机密锁值生成MD5后的密码

    $password = md5($password.$randomLock);

    //开始对字符串加密

    $txtStream = base64_encode($txtStream);

    $tmpStream = '';

    $i = 0;

    $j = 0;

    $k = 0;

    for ($i=0; $i<strlen($txtStream); $i++) {

        $k = ($k == strlen($password)) ? 0 : $k;

        $j = (strpos($lockstream, $txtStream[$i])+$lockCount+ord($password[$k]))%($lockLen);

        $tmpStream .= $lockstream[$j];

        $k++;

    }

    return $tmpStream.$randomLock;

}

/**

* 可逆的字符串解密函数

* @param int $txtStream 待加密的字符串内容

* @param int $password  解密密码

* @return string 解密后的字符串

*/

function decryptstr($txtStream, $password='58al92bl')

{

    //密锁串,不能出现重复字符,内有A-Z,a-z,0-9,/,=,+,_,

    $lockstream = 'st=lDEFABCNOPyzghi_jQRST-UwxkVWXYZabcdef+IJK6/7nopqr89LMmGH012345uv';

    $lockLen = strlen($lockstream);

    //获得字符串长度

    $txtLen = strlen($txtStream);

    //截取随机密锁值

    $randomLock = $txtStream[$txtLen - 1];

    //获得随机密码值的位置

    $lockCount = strpos($lockstream, $randomLock);

    //结合随机密锁值生成MD5后的密码

    $password = md5($password.$randomLock);

    //开始对字符串解密

    $txtStream = substr($txtStream, 0, $txtLen-1);

    $tmpStream = '';

    $i = 0;

    $j = 0;

    $k = 0;

    for ($i=0; $i<strlen($txtStream); $i++) {

        $k = ($k == strlen($password)) ? 0 : $k;

        $j = strpos($lockstream, $txtStream[$i]) - $lockCount - ord($password[$k]);

        while ($j < 0) {

            $j = $j + ($lockLen);

        }

        $tmpStream .= $lockstream[$j];

        $k++;

    }

    return base64_decode($tmpStream);

}

/**

* 检测/过滤字符串XSS注入

* @param string  $val                 输入字符串(数字类型请用intval或者floatval转换处理)

* @param boolean $onlycheck           是否仅检测(true:仅检测,返回结果为boolean; 默认:返回过滤字符串)

* @param string  $allowable_html_tags 允许的html标签('none':清除全部html标签; '<p><a>':保留p和a标签,同strip_tags第二个参数; 默认:不做处理)

* @param boolean $htmlspecialchars    是否使用htmlspecialchars函数处理返回结果(ture:使用;默认:不使用)

* @return mix

*/

function removeXSS($val, $onlycheck = false, $allowable_html_tags = '', $htmlspecialchars = false)

{

    $isdangerous = false;

    //如果设置了过滤全部html标签,则过滤全部标签

    if ($allowable_html_tags == 'none')

        $val = strip_tags($val);

    //如果设置了可使用的html标签,则保留这部分标签

    elseif ($allowable_html_tags != '')

        $val = strip_tags($val, $allowable_html_tags);

    $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);

    $search = 'abcdefghijklmnopqrstuvwxyz';

    $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

    $search .= '1234567890!@#$%^&*()';

    $search .= '~`";:?+/={}[]-_|\'\\';

    for ($i = 0; $i < strlen($search); $i++) {

        $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val);

        $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val);

    }

    $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', '<xml', '&lt;xml', '&#60;xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');

    $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');

    $ra = array_merge($ra1, $ra2);

    $found = true;

    while ($found == true) {

        $val_before = $val;

        for ($i = 0; $i < sizeof($ra); $i++) {

            $pattern = '/';

            for ($j = 0; $j < strlen($ra[$i]); $j++) {

                if ($j > 0) {

                    $pattern .= '(';

                    $pattern .= '(&#[xX]0{0,8}([9ab]);)';

                    $pattern .= '|';

                    $pattern .= '|(&#0{0,8}([9|10|13]);)';

                    $pattern .= ')*';

                }

                $pattern .= $ra[$i][$j];

            }

            $pattern .= '/i';

            $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2);

            $val = preg_replace($pattern, $replacement, $val);

            if ($val_before == $val) {

                $found = false;

            } else {

                $isdangerous = true;

            }

        }

    }

    if ($onlycheck === false) {

        if ($htmlspecialchars === false)

            return $val;

        else

            return Htmlspecialchars_For_php54($val);

    } else

        return $isdangerous;

}

//mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [,int &$count ]] )

//string dechex ( int $number )

返回一字符串,包含有给定 number 参数的十六进制表示。

mixed parse_url ( string $url [, int $component = -1 ] )

本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));

echo parse_url($url, PHP_URL_PATH);

输出开始:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
/path

输出结束

Note:

本函数不能用于相对 URL。

Note:

parse_url() 是专门用来解析 URL 而不是 URI 的。不过为遵从 PHP 向后兼容的需要有个例外,对 file:// 协议允许三个斜线(file:///...)。其它任何协议都不能这样。

API.php

mkdir($dir, 0777, true)

http://php.net/manual/zh/function.mkdir.php(例子很经典)

bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context]]] )

尝试新建一个由 pathname 指定的目录。

http://php.net/manual/zh/function.gettimeofday.php

mixed gettimeofday ([ bool $return_float = false ] )

返回一个关联数组,包含有系统调用返回的数据

参数$return_float

当其设为 TRUE 时,会返回一个浮点数而不是一个数组。

<?php

print_r(gettimeofday());

echo gettimeofday(true);

?>

输出:

Array
(
    [sec] => 1073504408
    [usec] => 238215
    [minuteswest] => 0
    [dsttime] => 1
)
1073504408.23910

http://php.net/manual/zh/function.strncmp.php

int strncmp ( string $str1 , string $str2 , int $len )

该函数与 strcmp() 类似,不同之处在于你可以指定两个字符串比较时使用的长度(即最大比较长度)。

注意该比较区分大小写。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

/**

    * 将数组转换成XML

    * @param mixed  $data          数据

    * @param string  $root          node值

    * @param boolean $ignore_numkey 是否忽略数值键做节点名

    * @return string

    */

    public function arrayToXml($data, $root='data', $ignore_numkey=true)

    {

        $root = trim($root);

        if (strlen($root) == 0) {

            return '';

        }

        if (is_object($data) || is_resource($data)) {

            return '';

        }

        $xml = '';

        if (true !== $ignore_numkey || !is_numeric($root))

            $xml = "<".$root.">";

        if (!is_array($data)) {

            $xml .= Htmlspecialchars_For_php54($data);

        } else {

            $xml .= "\r\n";

            foreach ($data as $k=>$v) {

                $xml .= $this->arrayToXml($v, $k, $ignore_numkey);

            }

        }

        if (true !== $ignore_numkey || !is_numeric($root))

            $xml .= "</".$root.">\r\n";

        return $xml;

    }

    /**

    * 将数据从$from编码转换成$to编码

    * @param mixed  $data 要转码的数据

    * @param string $from 源编码

    * @param string $to  目标编码

    * @return mixed

    */

    protected function convertData($data, $from, $to)

    {

        $return = $data;

        if (is_array($data)) {

            foreach ($data as $key=>$val)

                $return[$key] = $this->convertData($val, $from, $to);

        } else {

            $return = iconv($from, $to.'//IGNORE', $data);

        }

        return $return;

    }

http://php.net/manual/zh/function.end.php 可以看看与之相关的函数
mixed end ( array &$array )

参数$array,该数组是通过引用传递的,因为它会被这个函数修改。 这意味着你必须传入一个真正的变量,而不是函数返回的数组,因为只有真正的变量才能以引用传递。

返回最后一个元素的值,或者如果是空数组则返回 FALSE。

http://php.net/manual/zh/function.date.php

string date ( string $format [, int $timestamp ] )

返回将整数 timestamp 按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp 是可选的,默认值为 time()。

http://php.net/manual/zh/function.fopen.php

fopen(); fwrite();fcolse();

CheckCode.php 验证码类 有验证码的验证和生成

Crypt.php 改进的crypt()函数类

DES.php      DES加解密

4:api/data/data.php文件

preg_match

项目中代码运用

if ($params['memo']!='') {

    $memoStr=strtolower($params['memo']);

    if (preg_match('/android/i', $memoStr))

        $params['os']='Android';

    elseif (preg_match('/ip(hone|od)/i', $memoStr))

        $params['os']='Iphone';

    elseif (preg_match('/symbian/i', $memoStr))

        $params['os']='Symbian';

    elseif (preg_match('/windows (ce|phone)/i', $memoStr))

        $params['os']='windowsPhone';

    else

        $params['os']='unknwon';

}

讲解 http://php.net/manual/zh/function.preg-match.php

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int$offset = 0 ]]] )

matches

如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本,$matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。

preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。

例子:

$subject = "abcdef";

$pattern = '/^def/';

preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);

preg_match($pattern, substr($subject,3), $matchesnoFlag);

var_dump($matches,$matchesnoFlag);

输出:

array (size=1)
  0 =>
    array (size=2)
      0 => string 'def' (length=3)
      1 => int 0

array (size=1)
  0 => string 'def' (length=3)

<?php

$str = 'foobar: 2008';

preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

/* 下面例子在php 5.2.2(pcre 7.0)或更新版本下工作, 然而, 为了后向兼容, 上面的方式是推荐写法. */

// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

print_r($matches);

?>

输出

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

preg_match_all

项目中运用

//获取global_cookie值

if ($params['imei']=='') {

    $p='/(?<=global_cookie=)([^;]*)(?=;)/i';

    preg_match_all($p, $_SERVER['HTTP_COOKIE'], $cookie);

    $params['imei']=$cookie[1][0];

}

int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags =PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

搜索subject中所有匹配pattern给定正则表达式 的匹配结果并且将它们以flag指定顺序输出到matches中.

在第一个匹配找到后, 子序列继续从最后一次匹配位置搜索.

flags

可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):

PREG_PATTERN_ORDER

结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推。

preg_match_all("|<[^>]+>(.*)</[^>]+>|U",

    "<b>example: </b><div align=left>this is a test</div>",

    $out, PREG_PATTERN_ORDER);

var_dump($out);

输出:

array (size=2)

  0 =>
    array (size=2)
      0 => string '<b>example: </b>' (length=16)
      1 => string '<div align=left>this is a test</div>' (length=36)
  1 =>
    array (size=2)
      0 => string 'example: ' (length=9)
      1 => string 'this is a test' (length=14)

PREG_SET_ORDER

结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组), $matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推。

preg_match_all("|<[^>]+>(.*)</[^>]+>|U",

    "<b>example: </b><div align=\"left\">this is a test</div>",

    $out, PREG_SET_ORDER);

var_dump($out);

输出

array (size=2)

  0 =>
    array (size=2)
      0 => string '<b>example: </b>' (length=16)
      1 => string 'example: ' (length=9)
  1 =>
    array (size=2)
      0 => string '<div align="left">this is a test</div>' (length=38)
      1 => string 'this is a test' (length=14)

header("Content-Type: image/gif");

header("Cache-Control: "."private, no-cache, no-cache=Set-Cookie, proxy-revalidate");

header("Pragma: no-cache");

header("Expires: Wed, 17 Sep 1975 21:32:10 GMT");

<?php

// We'll be outputting a PDF

header('Content-type: application/pdf');

// It will be called downloaded.pdf

header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf

readfile('original.pdf');

?>

请注意 header() 必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。这是个常见的错误,在通过include,require,或者其访问其他文件里面的函数的时候,如果在header()被调用之前,其中有空格或者空行。 同样的问题也存在于单独的 PHP/HTML 文件中。

这两篇博客不错

http://www.111cn.net/phper/php-function/55872.htm

http://blog.sina.com.cn/s/blog_7298f36f01011dxv.html

join:implode的别名 http://php.net/manual/zh/function.implode.php(讲解很经典了)

chr — 返回指定的字符 http://php.net/manual/zh/function.chr.php

string chr ( int $ascii )

返回相对应于 ascii 所指定的单个字符。

此函数与 ord() 是互补的。

5:api/cron/sitemap_esf.php文件以及类似文件

set_time_limit — 设置脚本最大执行时间

说明

void set_time_limit ( int $seconds )

设置允许脚本运行的时间,单位为秒。如果超过了此设置,脚本返回一个致命的错误。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。

当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20),那么,脚本在超时之前可运行总时间为45秒。

参数 ¶

seconds

最大的执行时间,单位为秒。如果设置为0(零),没有时间方面的限制。

返回值

没有返回值。

注释 ¶

Warning

当php运行于安全模式时,此功能不能生效。除了关闭安全模式或改变php.ini中的时间限制,没有别的办法。

Note:

set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。在测量时间是实值的Windows中,情况就不是如此了。

array_unique

(PHP 4 >= 4.0.1, PHP 5)

array_unique — 移除数组中重复的值

说明 ¶

array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )

array_unique() 接受 array 作为输入并返回没有重复值的新数组。

注意键名保留不变。array_unique() 先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留。

Note: 当且仅当 (string) $elem1 === (string) $elem2 时两个单元被认为相同。就是说,当字符串的表达一样时。 第一个单元将被保留。

<?php

$input = array("a" => "green", "red", "b" => "green", "blue", "red");

$result = array_unique($input);

print_r($result);

?>

以上例程会输出:

Array
(
    [a] => green
    [0] => red
    [1] => blue
)

Example #2 array_unique() 和类型

<?php

$input = array(4, "4", "3", 4, 3, "3");

$result = array_unique($input);

var_dump($result);

?>

以上例程会输出:

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}

http://php.net/manual/zh/function.array-filter.php 例子很经典,值得一看

array_filter — 用回调函数过滤数组中的单元

array array_filter ( array $input [, callable $callback = "" ] )

依次将 input 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE,则 input 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。

如果没有提供 callback 函数, 将删除 input 中所有等值为 FALSE 的条目。

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);
$array3 = array('',0,false,null,1,"");
echo "Odd :\r\n";
print_r(array_filter($array1, "odd"));//Array ( [a] => 1 [c] => 3 [e] => 5 )
echo "Even:\n\r";
print_r(array_filter($array2, "even"));//Array ( [0] => 6 [2] => 8 [4] => 10 [6] => 12 )
echo "strlenFilter:\r\n";
print_r(array_filter($array3, "strlen"));//Array ( [1] => 0 [4] => 1 )


FileLock.php

file_exists  bool file_exists ( string $filename )

    /**
     * 对文件进行加锁
     * @return boolean
     */
    public function lockFile()
    {
        $file = $this->_file;
        $locktype = LOCK_EX|LOCK_NB;
        $can_write = false;
        $handle = fopen($file, "wb");
        if ($handle) {
$can_write = flock($handle, $locktype);
        }
        //只有在可写的情况下才设置可复用的文件句柄 $this->_handle
        if ($can_write) {
            $this->_file = $file;
            $this->_handle = $handle;
            return true;
        } else {
            if ($handle != false) {
                fclose($handle);
            }
            return false;
        }
    }
    /**
     * 对文件解锁
     * @return null
     */
    public function unlockFile()
    {
        $handle = $this->_handle;
flock($handle, LOCK_UN);
        fclose($handle);
    }


FileLog.php

//检查目录是否存在,若不存在则创建之
        if (!is_dir($dir)) {
            if (false === mkdir($dir, 0777, true)) {
                $this->_errorno = 1;
            }
        }


    /**
     * 删除过期日志
     * @return null
     */
    public function clearExpireLog()
    {
        $keep = $this->_keepmonth;
        $yearnow = date('Y');
        $monthnow = date('m');
        //年初的月再加上 12
        $monthdelete = ($monthnow <= $keep) ? ($monthnow + 12 - $keep) : ($monthnow - $keep);
        //不是年初的月由于数学操作会变成一位数,还得再变成2位数,方便后面找目录
        $monthdelete = sprintf('%02d', $monthdelete);
        $yeardelete = ($monthnow <= $keep) ? ($yearnow - 1) :$yearnow;
        $this->fileWrite(date('Y-m-d H:i:s').' Deleting log.');
        //加上 GLOB_ONLYDIR 仅返回路径,不要文件
        //这里 glob 的模式其实是完整的物理路径 D:\soufun\comment\data\log\*\*\*,允许这样多级用星号通配,则可一次性遍历出 D:\soufun\comment\data\log 下全部再3级的子目录,如 D:\soufun\comment\data\log\add_audit\2008\11 或者 D:\soufun\comment\data\log\rsync_audit\2008\12
        foreach (glob($this->_dir.'*'.DIRECTORY_SEPARATOR.'*'.DIRECTORY_SEPARATOR.'*', GLOB_ONLYDIR) as $logthis) {
            //截掉最后 7 位的年和月数,再加上要删除的年月数
            $dir2delete = substr($logthis, 0, -7).$yeardelete.DIRECTORY_SEPARATOR.$monthdelete;
            //再比较,凡是早于要删除的年月数的文件夹,一律删除
            if (($logthis <= $dir2delete ) && is_dir($logthis)) {
                $files = glob($logthis.DIRECTORY_SEPARATOR.'*');
                foreach ($files as $file) {
                    if (is_file($file)) {
unlink($file);
                    }
                }
                $msg = date('Y-m-d H:i:s').' '.$logthis;
                if (rmdir($logthis)) {
                    $msg .= ' deleted.';
                } else {
                    $msg .= ' failed.';
                    $this->_errorno = 4;
                }
                $this->fileWrite($msg);
            }
        }
        $msg = date('Y-m-d H:i:s').' Done.';
        $this->fileWrite($msg);
    }

array glob ( string $pattern [, int $flags = 0 ] )

寻找与模式匹配的文件路径

http://php.net/manual/zh/function.glob.php

返回一个包含有匹配文件/目录的数组。如果出错返回 FALSE

<?php
foreach (glob("*.txt") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}
?>

类似输出

funclist.txt size 44686
funcsummary.txt size 267625
quickref.txt size 137820


HttpHandle.php <?php
if (!extension_loaded('gd')) {
if (!dl('gd.so')) {
exit;
}
}
?>
bool extension_loaded ( string $name )检查一个扩展是否已经加载。
bool dl ( string $library )载入指定参数 library 的 PHP 扩展。
dl — 运行时载入一个 PHP 扩展

array gethostbynamel ( string $hostname )
Returns an array of IPv4 addresses or FALSE if hostname could not be resolved.

$hosts = gethostbynamel('www.baidu.com');
print_r($hosts);//Array ( [0] => 220.181.112.244 [1] => 220.181.111.188 )

mixed array_rand ( array $input [, int $num_req = 1 ] )
如果你只取出一个(第二个参数为1的时候),array_rand() 返回一个随机单元的键名,否则就返回一个包含随机键名的数组

input

输入的数组。
num_req

指明了你想取出多少个单元。如果指定的数目超过了数组里的数量将会产生一个 E_WARNING 级别的错误。

SystemDriver文件里面的类都值得一读

FileConfigDriver.php文件 配置文件访写

http://php.net/manual/zh/function.preg-split.php 例子很经典

posted on 2016-04-07 09:47  Ryanyanglibin  阅读(360)  评论(0编辑  收藏  举报

导航