搜房代码学习
基础的公共类:
php写接口
1.入口index.php
require '../../include/inc.php';//查看 http://www.cnblogs.com/xia520pi/p/3697099.html 知晓require 和include的区别
//设置最大使用内存数量
ini_set('memory_limit', '512M');//
ini_set('display_errors', true);
$_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 '&'
- '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
- "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set.
- '<' (less than) becomes '<'
- '>' (greater than) becomes '>'
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,8}'.ord($search[$i]).';?)/', $search[$i], $val);
}
$ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', '<xml', '<xml', '<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,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 orFALSE
ifhostname
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文件 配置文件访写
posted on 2016-04-07 09:47 Ryanyanglibin 阅读(396) 评论(0) 编辑 收藏 举报