2012-1-30 17:39 Monday  

首先,向写这篇文章的GG 或MM表示感谢!

如果你不断地建立不同的函数来检查或者操作字符串的一部分,现在你可能要放弃所有的这些函数,取而代之的用正则表达式。如果你对下列的问题都答“是的”,那么你肯定要考虑使用正则表达式了:

补充开始----------------------------

配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{ 4,15 }$
匹配国内电话号码:(\d{ 3 }-|\d{ 4 }-)?(\d{ 8 }|\d{ 7 })?
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$


下表是元字符及其在正则表达式上下文中的行为的一个完整列表:

\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。

^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。

$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。

* 匹配前面的子表达式零次或多次。

+ 匹配前面的子表达式一次或多次。+ 等价于 { 1, }。

? 匹配前面的子表达式零次或一次。? 等价于 { 0,1 }。

{ n } n 是一个非负整数,匹配确定的n 次。

{ n, } n 是一个非负整数,至少匹配n 次。

{ n,m } m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。

? 当该字符紧跟在任何一个其他限制符 (*, +, ?, { n }, { n, }, { n,m }) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。

. 匹配除 "\n" 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符,请使用象 ’[.\n]’ 的模式。
(pattern) 匹配pattern 并获取这一匹配。

(?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

(?!pattern) 负向预查,与(?=pattern)作用相反

x|y 匹配 x 或 y。

[xyz] 字符集合。

[^xyz] 负值字符集合。

[a-z] 字符范围,匹配指定范围内的任意字符。

[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。

\b 匹配一个单词边界,也就是指单词和空格间的位置。

\B 匹配非单词边界。

\cx 匹配由x指明的控制字符。

\d 匹配一个数字字符。等价于 [0-9]。

\D 匹配一个非数字字符。等价于 [^0-9]。

\f 匹配一个换页符。等价于 \x0c 和 \cL。

\n 匹配一个换行符。等价于 \x0a 和 \cJ。

\r 匹配一个回车符。等价于 \x0d 和 \cM。

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。

\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t 匹配一个制表符。等价于 \x09 和 \cI。

\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。

\W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。

\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。

\num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。

\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

\un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。

------------------------------补充结束

你是否正在写一些定制的函数来检查表单数据(比如在电子信箱地址中的一个@,一个点)
你是否写一些定制的函数,在一个字符串中循环每个字符,如果这个字符匹配了一个特定特征(比如它是大写的,或者它是一个空格),那么就替换它?
除了是令人不舒服的字符串检查和操作方法,如果没有有效率地写代码,上述的两条也会使你的程序慢下来。你是否更倾向于用下面的代码检查一个电子信箱地址呢:

<?php
function validateEmail($email)
{
$hasAtSymbol = strpos($email, "@");
$hasDot = strpos($email, ".");
if($hasAtSymbol && $hasDot)
return true;
else
return false;
}
echo validateEmail("mitchell@devarticles.com");
?>
... 或者使用下面的代码:

<?php
function validateEmail($email)
{
return ereg("^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$", $email);
}
echo validateEmail(mitchell@devarticles.com);
?>

可以肯定的是,第一个函数比较容易,而且看起来结构也不错。但是如果我们用上面的下一个版本的email地址检查函数不是更容易吗?

上面展示的第二个函数只用了正则表达式,包括了对ereg函数的一个调用。Ereg 函数返回true或者false,来声明它的字符串参数是否和正则表达式相匹配。

很多编程者避开正则表达式,只因为它们(在一些情况下)比其它的文本处理方法更慢。正则表达式可能慢的原因是因为它 们涉及把字符串在内存中拷贝和粘贴,因为正则表达式的每一个新的部分都对应匹配一个字符串。但是,从我对正则表达式的经验来说,除非你在文本中几百个行运 行一个复杂的正则表达式,否则性能上的缺陷都可以忽略不计,当把正则表达式作为输入数据检查工具时,也很少出现这种情况。


正则表达式语法
在你可以匹配一个字符串到正则表达式之前,你必须先建立正则表达式。开始的时候,正则表达式的语法有点古怪,表达式中的每一个短语代表某个类型的搜索特征。下列是一些最普通的正则表达式,也都对应着一个如何使用它的例子:

字符串头部
搜索一个字符串的头部,用^,例如

<?php echo ereg("^hello", "hello world!"); ?>
将返回 true, 但是
<?php echo ereg("^hello", "i say hello world"); ?>
将返回 false, 因为hello不在字符串”I say hello world”的头部。
字符串尾部

搜索字符串尾部,用$,例如:
<?php echo ereg("bye$", "goodbye"); ?>
将返回true, 但是
<?php echo ereg("bye$", "goodbye my friend"); ?>
将返回 false,因为bye不在字符串”goodbye my friend”的尾部.

任意的单个字符
搜索任意字符,用点(.),例如:
<?php echo ereg(".", "cat"); ?>
将返回true,但是
<?php echo ereg(".", ""); ?>
将返回false,因为我们的要搜索字符串没有包含字符。你可以用花括号随意告诉正则表达式引擎它要匹配多少个单个字符。如果我只想匹配5个字符,我可以这样用ereg:
<?php echo ereg(".{ 5 }$", "12345"); ?>
上面的这段代码告诉正则表达式引擎当且仅当至少5个连续的字符出现字符串的尾部时返回true.我们也可以限制连续出现的字符的数目:
<?php echo ereg("a{ 1,3 }$", "aaa"); ?>
在上面的例子里,我们已经告诉正则表达式引擎,我们的搜索字符串来匹配表达式,它在尾部必须有介于1和3个的”a”字符。
<?php echo ereg("a{ 1,3 }$", "aaab"); ?>
上面的例子将不会返回true,虽然有三个”a”字符在搜索字符串里,但是它们不是在字符串的尾部。如果我们把结尾字符串匹配$从正则表达式中去掉,那么这个字符串是匹配的。
我们也可以告诉正则表达式引擎来匹配至少有确定数目的字符在一行,如果它们存在的,可以匹配更多。 我们可以这样做:
<?php echo ereg("a{ 3, }$", "aaaa"); ?>

零或多次重复字符
为了告诉正则表达式引擎一个字符可能存在,也可以重复,我们用*字符。这里的两个例子都将返回true.

<?php echo ereg("t*", "tom"); ?>
<?php echo ereg("t*", "fom"); ?>
即使第二个例子不包含”t”这个字符,但仍旧返回ture,因为*表示字符可以出现,但不是必须出现。事实上,任何普通的字符串模式都会使上面的ereg调用返回true,因为’t’字符是可选的.


一或多次重复字符
为了告诉正则表达式引擎一个字符必须存在,也可以重复不止一次,我们用+字符,像

<?php echo ereg("z+", "i like the zoo"); ?>
下面的例子也会返回true:
<?php echo ereg("z+", "i like the zzzzzzoo!"); ?>

零或一次重复字符
我们也可以告诉正则表达式引擎,一个字符必须是或者只存在一次,或者没有。我们用?字符来做这项工作,就像
<?php echo ereg("c?", "cats are fuzzy"); ?>
如果我们愿意,我们完全可以从上面的搜索字符串中删除’c’,这个表达式会仍旧返回true.’?’ 的意思是一个’c’可以出现在搜索字符串的任何地方,但不是必须的。


正则表达式语法 (续)
空格字符
为了匹配一个搜索字符串中的空格字符,我们用预定义Posix的类,[[:space]].方括号标明连续字符的相关性,”:space:”是实际要匹配 的类(在这种情形下,是任何空白字符)。空白包括tab字符,新行字符,空白字符。或者,如果搜索字符串必须包含只有一个空格,而不是一个tab或者新行 字符,你可以用一个空格字符(" ")。在大多数情况下,我倾向于使用":space:",因为这意味着我的意图不仅仅是单个空格字符,这点很容易被忽视。这里有一些Posix-标准预定 义类,
有一些我们可以作为正则表达式的部分的一些Posix-标准预定义类,包括[:alnum:], [:digit:], [:lower:]等等。 完整的列表可以在这里查看

我们可以像这样匹配单个空白字符:

<?php echo ereg("Mitchell[[:space:]]Harper", "Mitchell Harper"); ?>
我们也可以通过在表达式后用?字符来告诉正则表达式引擎匹配没有空白或者一个空白。
<?php echo ereg("Mitchell[[:space:]]?Harper", "MitchellHarper"); ?>

模式分组
相关的模式可以在方括号里分在一起。很容易用[a-z]和[A-Z]指定只有一个小写字母或者一列大写字母以搜索字符串的一部分存在。
<?php
// 要求从第一个到最后一个都是小写字母
echo ereg("^[a-z]+$", "johndoe"); // 返回true
?>
或者像
<?php
// 要求从第一个到最后一个都是大写字母
ereg("^[A-Z]+$", "JOHNDOE"); // 返回 true?
?>
我们也可以告诉正则表达式引擎,我们希望或者是小写字母,或者是大写字母。我们只要把[a-z]和[A-Z]模式结合在一起就可以做到。
<?php echo ereg("^[a-zA-Z]+$", "JohnDoe"); ?>
在上面的例子里,如果我们能匹配"John Doe",而不是"JohnDoe",将是非常有意义的。我们用下面的正则表达式来做这个:
^[a-zA-Z]+[[:space:]]{ 1 }[a-zA-Z]+$
很容易搜索一个数字字符串
<?php echo ereg("^[0-9]+$", "12345"); ?>

词语分组
不仅仅搜索模式可以分组,我们也可以用圆括号把相关的搜索词语进行分组。
<?php echo ereg("^(John|Jane).+$", "John Doe"); ?>
在上面的例子中,我们有一个字符串头部字符,紧跟着"John"或者"Jane",至少有一个其它字符,然后一个字符串尾部字符。所以…
<?php echo ereg("^(John|Jane).+$", "Jane Doe"); ?>
...将也匹配我们的搜索模式

特殊字符的情形
因为一些字符要用在一个搜索模式的明确分组或者语法上,像在(John|Jane)中的圆括号,我们需要告诉正则表达式引擎来屏蔽这些字符,加工它们使之 成为被搜索字符串的一部分,而不是搜索表达式的一部分。我们所用的方法称为“字符转义”,涉及到将任何“专用符号”加上反斜杠。所以,例如,如果我想在我 的搜索中包含’|’,那么我就可以这样做
<?php echo ereg("^[a-zA-z]+\|[a-zA-z]+$", "John|Jane"); ?>
这里只是少量的一些你要转义的字符,你必须转义^, $, (, ), ., [, |, *, ?, +, \ and { 。
希望你现在对正则表达式实际上有多么强大有了一点点感觉了。现在让我们看两个用正则表达式来检查数据中一个字符串的例子。


正则表达式例子
例子1
让我们把第一个例子做的相当简单,检验一个标准的URL.一个标准的URL(没有端口号),有三个部分构成:

[协议]://[域名]

让我们从匹配URL的协议部分开始,并且让它只能用http或者ftp.我们可以用下面的正则表达式做到这点:

^(http|ftp)
^字符特指字符串的头部,利用圆括号把http和ftp围住,且用“或者”符号(|)将它们分开,我们告诉正则表达式引擎http和ftp两者之一必须在字符串的开头。

一个域名通常由www.somesite.com构成,但是可以随意选择要不要www部分。为了例子简单,我们只允许.com,.net,和.org的域名是在考虑之中的。我们最好这样对正则表达式中的域名部分表示如下:
(www\.)?.+\.(com|net|org)$
把所有的东西放在一起,我们的正则表达式就可以用作检查一个域名,如:

<?php
function isValidDomain($domainName)
{

return ereg("^(http|ftp)://(www\.)?.+\.(com|net|org)$", $domainName);
}
//真(true)
echo isValidDomain("http://www.somesite.com");
//真(true)
echo isValidDomain("ftp://somesite.com");
//假 (false)
echo isValidDomain("ftp://www.somesite.fr");
//假 (false)
echo isValidDomain(www.somesite.com);
?>

例子二
因为我居住在澳大利亚悉尼,让我们检查一个典型的澳大利亚国际电话号码。澳大利亚国际电话号码的格式如下:
+61x xxxx-xxxx
第一个x是区号,其它的都是电话号码。检查以'+61'开头且紧跟一个在2到9之间的区号的电话号码,我们用下面的正则表达式:

^\+61[2-9][[:space:]]
注意,上面的搜索模式把'+'字符用''转义,以便于可以在搜索中包含,不至于被解释为一个正则表达式。[2-9]告诉正则表达式引擎我们需要包含一个2到9之间的数字。[[:space:]]类则告诉正则表达式期望在这里有一个空白。

这里是电话号码剩下的搜索模式:
[0-9]{ 4 }-[0-9]{ 4 }$
这里没有什么不寻常的地方,我们只是告诉正则表达式引擎电话号码可用的数字,它必须是4个数字的组合,跟着一个连接符,再跟着另一个4个数字的组合,然后一个字符串尾部字符。
把完整的正则表达式放在一起,放进一个函数,我们可以用代码来检查一些澳大利亚国际电话号码:
<?php
function isValidPhone($phoneNum)
{
echo ereg("^\+61[2-9][[:space:]][0-9]{ 4 }-[0-9]{ 4 }$", $phoneNum);
}
// 真(true)
echo isValidPhone("+619 0000-0000");
// 假(false)
echo isValidPhone("+61 00000000");
//假( false)
echo isValidPhone("+611 00000000");
?>

2012-1-30 17:38 Monday  
<form id="form1" name="form1" method="post" action="">
   <input type="text" name="start" />
  到
  <input type="text" name="end" />
   <input type="submit" name="Submit" value="提交" />
   <input type="reset" name="Submit2" value="重置" />
</form>

<?php /* *心若水寒 *http://www.phpfans.net/ */ if(isset($_POST['Submit'])){ $conn = mysql_connect("localhost","root",""); mysql_query("set names 'gbk'"); mysql_select_db("caiji2"); for($i=$_POST['start'];$i<=$_POST['end'];$i++){ $url = "http://www.phper.com/html/php-mysql/".$i.".html"; @$fp = fopen($url,'r'); if(!$fp) continue; $buffer = ''; while(@!feof($fp)){ $buffer .= @fread($fp,1024); } preg_match_all("/<h1>(.+?)</h1>/is",$buffer,$title); $title[0][0] = preg_replace("/<h1>(.+?)</h1>/is","1",$title[0][0]); $title = explode("——",$title[0][0]); $ar_subject = $title[0]; //echo $ar_subject;exit; preg_match_all("/<div class="content">(.+?)</div>/s",$buffer,$array); //echo $array[0][0];exit; //preg_match_all("/(.+)<br>/is",$array[0][0],$array); //$array[0][0] = str_replace("&lt;","<",$array[0][0]);CnPhper.com By Cnphper CnPhperFrom CnPhper.com //$array[0][0] = str_replace("&gt;",">",$array[0][0]); //$array[0][0] = htmlspecialchars($array[0][0]); //$array[0][0] = str_replace("<BR>","n",$array[0][0]); //$array[0][0] = str_replace("&nbsp;"," ",$array[0][0]); $ar_content = strip_tags($array[0][0],"<br>"); //$ar_content = str_replace("From CnPhper.com","",$ar_content); //$ar_content = preg_replace("/CnPhper.com/i","",$ar_content); //echo $ar_content;exit; //$ar_content = substr($array[0][0],14,-6); $sql = "insert into cdb_article values(null,'未知','".addslashes($ar_subject)."','".addslashes($ar_content)."','互联网','2006-07-20',0,4,0,1,0)"; mysql_query($sql,$conn); fclose($fp); } } ?>

<?php
/**
* 采集百度的搜索结果,可以用到站内搜索,节省资源
* 分页部分就没有处理了,需在函数外处理
*
* @author Aboc QQ:9986584
*/

function searchBaidu($keyword,$page=0){
  
   if(empty($keyword))return false;
   $keyword = urlencode($keyword);
   if($page>76)$page=76;
   $content = file_get_contents("http://www.baidu.com/s?wd=".$keyword.'&pn='.$page);
   //echo $content;
  
   //如果找不到
   if(strpos($content,'抱歉,没有找到与“<font color="#C60A00">')!==false)return false;
  
   preg_match('/百度一下,找到相关网页(.*)篇,用时/',$content,$a);
   //搜索结果数
   $num = str_replace(array('约',','),'',$a[1]);
   $page = ceil($num)/10;
   //echo $num;

   //采集到的标题
   preg_match_all('/(\<font size=\"3\"\>(.+?)\<\/font\>\<\/a\>\<br\>)/',$content,$b);
   //print_r($b[2]);
   $title = $b[2];

   //采网址
   preg_match_all('/(\<a onmousedown=\"(.+?)\" href=\"(.+?)\" target=\"_blank\"\>)/',$content,$c);
   //print_r($c);
   $href = $c[3];

   //采内容
   preg_match_all('/(\<font size=-1\>(.+?)\<br\>)/',$content,$d);
   //print_r($d);
   $detail = $d[2];
  
   $end = array();
   $end[0] = array('num'=>ceil($num),'page'=>$page);
   foreach( $title as $key=>$row ){
    $end[1][$key]['title']=$title[$key];
    $end[1][$key]['href']=$href[$key];
    $end[1][$key]['detail']=$detail[$key];
   }
   return $end;  
}

/**
* 使用
*/
   if( $search = searchBaidu('www.yiwuku.com') )
print_r($search);
else
echo '没有找到';

2012-1-30 17:36 Monday  

生成:

<?php
define('IN_ECS', true);

require('../includes/init.php');

$id = isset($_GET['id'])?$_GET['id']:'';
$key = isset($_GET['key'])?$_GET['key']:'';
if($key != 'DFDAe' || empty($id))die("错误");
$sql = "select goods_id,goods_sn,goods_name,goods_img,goods_thumb from girls_goods where brand_id=$id";
$rows = $db->getAll($sql);
//print_r($rows);
$doc = new DOMDocument();
$doc->formatOutput = true;
$goods = $doc->createElement('goods');
$doc->appendChild($goods);
foreach ($rows as $row){
$good = $doc->createElement('good');

$goods_id = $doc->createElement('goods_id');
   $goods_id2 = $doc->createTextNode($row['goods_id']);
   $goods_id->appendChild($goods_id2);
$good->appendChild($goods_id);
  
$goods_sn = $doc->createElement('goods_sn');
   $goods_sn2 = $doc->createTextNode($row['goods_sn']);
   $goods_sn->appendChild($goods_sn2);
$good->appendChild($goods_sn);
  
$goods_name = $doc->createElement('goods_name');
   $goods_name2 = $doc->createTextNode($row['goods_name']);
   $goods_name->appendChild($goods_name2);
$good->appendChild($goods_name);
  
$goods_img = $doc->createElement('goods_img');
   $goods_img2 = $doc->createTextNode('http://www.togirl.cn/'.$row['goods_img']);
   $goods_img->appendChild($goods_img2);
$good->appendChild($goods_img);
  
$goods_thumb = $doc->createElement('goods_thumb');
   $goods_thumb2 = $doc->createTextNode('http://www.togirl.cn/'.$row['goods_thumb']);
   $goods_thumb->appendChild($goods_thumb2);
$good->appendChild($goods_thumb);
  

$goods->appendChild($good);
}

echo $doc->saveXML();

读取到一个数组中

<?php
//header('charset:utf-8');
$doc = new DOMDocument();

$doc->load('http://www.yiwuku.com/xml/brand.php?id=13&key=DFDAe');
$goods = $doc->getElementsByTagName('good');
$newgoods = array();
foreach ($goods as $key=>$good){
$id = $good->getElementsByTagName('goods_id');
$newgoods[$key]['goods_id'] = $id->item(0)->nodeValue;

$sn = $good->getElementsByTagName('goods_sn');
$newgoods[$key]['goods_sn'] = $sn->item(0)->nodeValue;

$name = $good->getElementsByTagName('goods_name');
$newgoods[$key]['goods_name'] = iconv('utf-8','gbk',$name->item(0)->nodeValue);

$img = $good->getElementsByTagName('goods_img');
$newgoods[$key]['goods_img'] = $img->item(0)->nodeValue;

$thumb = $good->getElementsByTagName('goods_thumb');
$newgoods[$key]['goods_thumb'] = $thumb->item(0)->nodeValue;
}

print_r($newgoods);

2012-1-30 17:35 Monday  
extension=php_xdebug.dll
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="c:\php5\xdebug"

xdebug.profiler_output_dir="c:\php5\xdebug"

 

参数说明如下:

xdebug.overload_var_dump
 ...

阅读全文>>

2012-1-30 17:33 Monday  

自己弄了一个,不过好像速度不理想

   $badword='坏词一|坏词二';   //用|隔开词
   $word=explode('|',$badword);
   foreach ( $word as $value ) {
    if( strstr(str_replace(array(' ','\n'),array('',''),$form['Detail']),$value) ){
     die('有害信息');
    }

2012-1-30 17:32 Monday  

$fin_str = join($br,str_split($str,4));

str_split   将字符串分成相等的几个部分..(新数组)

然后用join 将新数组的值用$br连起来

不过对于含有HTML代码的,这样直接做可能不行,得另外想办法

2012-1-30 17:31 Monday  
array_change_key_case — 返回字符串键名全为小写或大写的数组
array_chunk — 将一个数组分割成多个
array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
array_count_values — 统计数组中所有的值出现的次数
array_diff_assoc — 带索引检查计算数组的差集
array_diff_key — 使用键名比较计算数组的差集
array_diff_uassoc — 用用户提供的回调函数做索引检查来计算数组的差集
array_diff_ukey — 用回调函数对键名比较计算数组的差集
array_diff — 计算数组的差集
array_fill_keys — Fill an array with values, specifying keys
array_fill — 用给定的值填充数组
array_filter — 用回调函数过滤数组中的单元
array_flip — 交换数组中的键和值
array_intersect_assoc — 带索引检查计算数组的交集
array_intersect_key — 使用键名比较计算数组的交集
array_intersect_uassoc — 带索引检查计算数组的交集,用回调函数比较索引
array_intersect_ukey — 用回调函数比较键名来计算数组的交集
array_intersect — 计算数组的交集
array_key_exists — 检查给定的键名或索引是否存在于数组中
array_keys — 返回数组中所有的键名
array_map — 将回调函数作用到给定数组的单元上
array_merge_recursive — 递归地合并一个或多个数组
array_merge — 合并一个或多个数组
array_multisort — 对多个数组或多维数组进行排序
array_pad — 用值将数组填补到指定长度
array_pop — 将数组最后一个单元弹出(出栈)
array_product — 计算数组中所有值的乘积
array_push — 将一个或多个单元压入数组的末尾(入栈)
array_rand — 从数组中随机取出一个或多个单元
array_reduce — 用回调函数迭代地将数组简化为单一的值
array_reverse — 返回一个单元顺序相反的数组
array_search — 在数组中搜索给定的值,如果成功则返回相应的键名
array_shift — 将数组开头的单元移出数组
array_slice — 从数组中取出一段
array_splice — 把数组中的一部分去掉并用其它值取代
array_sum — 计算数组中所有值的和
array_udiff_assoc — 带索引检查计算数组的差集,用回调函数比较数据
array_udiff_uassoc — 带索引检查计算数组的差集,用回调函数比较数据和索引
array_udiff — 用回调函数比较数据来计算数组的差集
array_uintersect_assoc — 带索引检查计算数组的交集,用回调函数比较数据
array_uintersect_uassoc — 带索引检查计算数组的交集,用回调函数比较数据和索引
array_uintersect — 计算数组的交集,用回调函数比较数据
array_unique — 移除数组中重复的值
array_unshift — 在数组开头插入一个或多个单元
array_values — 返回数组中所有的值
array_walk_recursive — 对数组中的每个成员递归地应用用户函数
array_walk — 对数组中的每个成员应用用户函数
array — 新建一个数组
arsort — 对数组进行逆向排序并保持索引关系
asort — 对数组进行排序并保持索引关系
compact — 建立一个数组,包括变量名和它们的值
count — 计算数组中的单元数目或对象中的属性个数
current — 返回数组中的当前单元
each — 返回数组中当前的键/值对并将数组指针向前移动一步
end — 将数组的内部指针指向最后一个单元
extract — 从数组中将变量导入到当前的符号表
in_array — 检查数组中是否存在某个值
key — 从关联数组中取得键名
krsort — 对数组按照键名逆向排序
ksort — 对数组按照键名排序
list — 把数组中的值赋给一些变量
natcasesort — 用“自然排序”算法对数组进行不区分大小写字母的排序
natsort — 用“自然排序”算法对数组排序
next — 将数组中的内部指针向前移动一位
pos — current() 的别名
prev — 将数组的内部指针倒回一位
range — 建立一个包含指定范围单元的数组
reset — 将数组的内部指针指向第一个单元
rsort — 对数组逆向排序
shuffle — 将数组打乱
sizeof — count() 的别名
sort — 对数组排序
uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
uksort — 使用用户自定义的比较函数对数组中的键名进行排序
usort — 使用用户自定义的比较函数对数组中的值进行排序
2012-1-30 17:30 Monday  
<?php
/**
* 修改session存放方式为Mysql Aboc QQ:9986584
*/

class Session{

//过期时间
private $_LEFT_TIME = 1440;

public function open() {


    }

public function close(){
    
}

/**
   * 读
   */
public function read( $sessid ) {
$sql = "select data from dm_session where sessid ='$sessid' and expiry > time()";
$row = DMmysql::open()->fetchRow( $sql );
return $row['data'];
}

/**
   * 写
   */
public function write( $sessid , $sessdata ) {
$data = array(
    'expiry'    =>   time()+ $this->_LEFT_TIME,
    'data'      =>   $sessdata,
    'ip'   =>   '192.168.1.123'
);
if( DMmysql::open()->fetchRow("select sessid from dm_session where sessid ='$sessid'") ) {
   //更新
   $where = "sessid = '$sessid'";
   if( DMmysql::open()->update( 'dm_session',$data,$where ) ){
    return true;
   } else {
    return false;
   }
} else {
   //插入
   $data['sessid'] = $sessid;
   if( DMmysql::open()->insert('dm_session',$data) ){
    return true;
   } else {
    return false;
   }   
}
}

/**
   * 指定销毁
   */
public function destroy( $sessid ) {
$where = "sessid = '$sessid'";
if(DMmysql::open()->delete('dm_session',$where)) {
   return true;
} else {
   return false;
}
}

/**
   * 销毁过期的数据
   */
public function gc( $maxlifetime ) {
//随机销毁数据,减轻服务器压力
if( rand(0,3) == 3 ) {
   $where = "expiry < time()";
   if( DMmysql::open()->delete('dm_session',$where) ) {
      return true;
   } else {
    return false;
   }
}
}

}

$session = new Session();
session_set_save_handler(
    array(&$session,'open'),
    array(&$session,'close'),
    array(&$session,'read'),
    array(&$session,'write'),
    array(&$session,'destroy'),
    array(&$session,'gc')
);
session_start();
?>

在每个使用session的文件前include一下就行了

数据库:

CREATE TABLE `dm_session` (
   `sessid` char(32) NOT NULL default '',
   `expiry` int(10) NOT NULL default '0',
   `data` text NOT NULL,
   `ip` char(15) NOT NULL default '',
   PRIMARY KEY   (`sessid`),
   KEY `sesskid` (`sessid`,`expiry`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
2012-1-30 17:29 Monday  
<?php
//FileName:Access.class.php
//Summary: Access数据库操作类
//Author: forest
//CreateTime: 2006-8-10
//LastModifed:
//copyright (c)2006
//http://freeweb.nyist.net/~chairy
//[email]chaizuxue@163.com[/email]
// 使用范例:
//$databasepath="database.mdb";
//$dbusername="";
//$dbpassword="";
//include_once("Access.class.php");
//$access=new Access($databasepath,$dbusername,$dbpassword);
// 2008.12.23 Aboc Edit /9986584
// 在判断字段是否为空时,用 is null / is not null
// 2011.4.30 Aboc Edit
class Access {
    var $databasepath, $constr, $dbusername, $dbpassword, $link;
    function Access($databasepath, $dbusername, $dbpassword) {
        $this->databasepath = $databasepath;
        $this->username = $dbusername;
        $this->password = $dbpassword;
        $this->connect ();
    }
    function connect() {
        $this->constr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath ( $this->databasepath );
        $this->link = odbc_connect ( $this->constr, $this->username, $this->password, SQL_CUR_USE_ODBC );
        if (!$this->link)die('数据库连接失败');
        return $this->link;
    }
    function query($sql) {
        return @odbc_exec ( $this->link, $sql );
    }
    function first_array($sql) {
        return odbc_fetch_array ( $this->query ( $sql ) );
    }
    function fetch_row($query) {
        return odbc_fetch_row ( $query );
    }
    
    /**
     * 取得记录总数
     *
     * @param unknown_type $sql
     * @return unknown
     */
    function total_num($sql) {
        return odbc_num_rows ( $this->query ( $sql ) );
    }
    
    /**
     * 关闭连接
     *
     */
    function close() {
        odbc_close ( $this->link );
    }
    
    /**
     * 插入
     *
     * @param unknown_type $table
     * @param unknown_type $array
     */
    function insert($table, $array) {
        if (empty($array))return false;
        $k = array();
        $v = array();
        foreach ($array as $key=>$value){
            if (!is_numeric($value)){
                $value = trim($value);
                $value = str_replace("'", "\'", $value);
            }
            $k[] = "`$key`";
            $v[] = "'$value'";            
        }
        $sql = "INSERT INTO " . $table . " (" . join(',', $k) . ") VALUES (" . join(',', $v) . ")";
        return $this->query ( $sql );
    }
    
    
    /**
     * 获取详情
     * Enter description here ...
     * @param unknown_type $table
     * @param unknown_type $field
     * @param unknown_type $id
     * @param unknown_type $colnum
     */
    function getinfo($table, $field, $id, $colnum) {
        $sql = "SELECT * FROM " . $table . " WHERE " . $field . "=" . $id . "";
        $query = $this->query ( $sql );
        if ($this->fetch_row ( $query )) {
            for($i = 1; $i < $colnum; $i ++) {
                $info [$i] = odbc_result ( $query, $i );
            }
        }
        return $info;
    }
    
    /**
     * 取得记录列表
     *
     * @param unknown_type $table
     * @param unknown_type $field
     * @param unknown_type $colnum
     * @param unknown_type $condition
     * @param unknown_type $sort
     * @return unknown
     */
    function getlist($table, $field, $colnum, $condition, $sort = "ORDER BY id DESC") {
        $sql = "SELECT * FROM " . $table . " " . $condition . " " . $sort;
        //echo $sql;
        $query = $this->query ( $sql );
        $i = 0;
        while ( $this->fetch_row ( $query ) ) {
            $recordlist [$i] = $this->getinfo ( $table, $field, odbc_result ( $query, 1 ), $colnum );
            $i ++;
        }
        return $recordlist;
    }
    
    /**
     * 取得记录列表
     *
     * @param unknown_type $table
     * @param unknown_type $field
     * @param unknown_type $fieldnum
     * @param unknown_type $condition
     * @param unknown_type $sort
     * @return unknown
     */
    function getfieldlist($table, $field, $fieldnum, $condition = "", $sort = "") {
        $sql = "SELECT " . $field . " FROM " . $table . " " . $condition . " " . $sort;
        $query = $this->query ( $sql );
        $i = 0;
        $rdlist = array();
        while ( $this->fetch_row ( $query ) ) {
            $info = array();
            for($j = 0; $j < $fieldnum; $j ++) {
                $info [$j] = odbc_result ( $query, $j + 1 );
            }
            $rdlist [$i] = $info;
            $i ++;
        }
        return $rdlist;
    }
    
    /**
     * 获取所有数据
     * Enter description here ...
     * @param unknown_type $table
     * @param unknown_type $field
     * @param unknown_type $where
     * @param unknown_type $limit
     * @param unknown_type $order
     */
    function fetchAll($table,$field=array(),$where,$limit='',$order=''){
        $where = !empty($where)?"where $where":'';
        $limit = $limit!=''?"top $limit":'';
        $order = $order != ''?" order by $order":'';
        $sql = "select $limit ".join(',', $limit)." from $table $where $order";
        $query = $this->query ( $sql );
        $i = 0;
        $fieldnum = count($field);
        $rdlist = array();
        while ( $this->fetch_row ( $query ) ) {
            $info = array();
            for($j = 0; $j < $fieldnum; $j ++) {
                $info [$field[$j]] = odbc_result ( $query, $j + 1 );
            }
            $rdlist [$i] = $info;
            $i ++;
        }
        return $rdlist;
    }    
    
    
    /**
     * 更新
     *
     * @param unknown_type $table
     * @param unknown_type $field
     * @param unknown_type $id
     * @param unknown_type $set
     */
    function updateinfo($table, $field, $id, $set) {
        $where = ! empty ( $field ) ? " WHERE " . $field . "=" . $id : "";
        $sql = "UPDATE " . $table . " SET " . $set . $where;
        return $this->query ( $sql );
    }
    
    /**
     * 更新2
     * Enter description here ...
     * @param unknown_type $table
     * @param unknown_type $array
     * @param unknown_type $where
     */
    function update($table,$array,$where){
        $where = !empty($where)?"where $where":'';
        if (empty($array))return false;
        $set = '';
        foreach ($array as $key=>$value){
            if (!is_numeric($value)){
                $value = trim($value);
                $value = str_replace("'", "\'", $value);
            }
            $set .= !empty($set)?",`$key`='$value'":"`$key`='$value'";            
        }
        return $this->query ("update $table set $set $where ");
    }
    
    /**
     * 删除
     *
     * @param unknown_type $table
     * @param unknown_type $field
     * @param unknown_type $id
     */
    function deleteinfo($table, $field, $id) {
        $where = ! empty ( $field ) ? " WHERE " . $field . "=" . $id : "";
        $sql = "DELETE FROM " . $table . $where;
        //echo $sql;exit;
        return $this->query ( $sql );
    }
    
    /**
     * 删除2
     * Enter description here ...
     * @param unknown_type $table
     * @param unknown_type $where
     */
    function delete($table,$where){
        $where = !empty($where)?"where $where":'';
        return $this->query ("DELETE FROM " . $table . $where);
    }
    
    /**
     * 依条件删除/带where
     *
     * @param unknown_type $table
     * @param unknown_type $condition
     */
    function deleterecord($table, $condition) {
        $sql = "DELETE FROM " . $table . " WHERE " . $condition;
        $this->query ( $sql );
    }
    
    /**
     * 取得指定条件的记录数/不带where
     *
     * @param unknown_type $table
     * @param unknown_type $condition
     * @return unknown
     */
    function getcondrecord($table, $condition = "") {
        $sql = "SELECT COUNT(*) AS num FROM " . $table . " " . $condition;
        $query = $this->query ( $sql );
        $this->fetch_row ( $query );
        $num = odbc_result ( $query, 1 );
        return $num;
    }
}
?>

2012-1-30 17:22 Monday  

PHP中正则表达式详细说明

  PHP继承*NIX的一贯传统,完全支持正规表达式的处理。正规表达式提供了一种高级的,但不直观的字符串匹配和处理的方法。用过PERL的正规表达式的朋友都知道,正规表达式的功能非常强大,但学起来不是那么容易。
  比如:
  
  ^.+@.+\..+$
  
  这段有效却难以理解的代码足够使一些程序员头痛(我就是)或者让他们放弃使用正规表达式。相信当你读完这个教程后,就可以理解这段代码的含义了。
  
  基本模式匹配
  
  一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:
  
  ^once
  
  这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。
  
  bucket$
  
  这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:
  
  ^bucket$
  
  只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式
  
  once
  
  与字符串
  
  There once was a man from NewYork
  Who kept all of his cash in a bucket.
  
  是匹配的。
  
  在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空 格、制表符等),要用到转义序列。所有的转义序列都用反斜杠(\)打头。制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以 用这个模式:
  
  ^\t
  
  类似的,用\n表示“新行”,表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\表示,句号.用\.表示,以此类推。
  
  字符簇
  
  在INTERNET的程序中,正规表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。
  
  所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:
  
  [AaEeIiOoUu]
  
  这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:
  
  [a-z] //匹配所有的小写字母
  [A-Z] //匹配所有的大写字母
  [a-zA-Z] //匹配所有的字母
  [0-9] //匹配所有的数字
  [0-9\.\-] //匹配所有的数字,句号和减号
  [ \f \t \n] //匹配所有的白字符
  ()之间要加空格
  同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式:
  
  ^[a-z][0-9]$
  
  尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。
  
  前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:
  
  ^[^0-9][0-9]$
  
  这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:
  
  [^a-z] //除了小写字母以外的所有字符
  [^\/\^] //除了(\)(/)(^)之外的所有字符
  [^"\'] //除了双引号(")和单引号(')之外的所有字符
  
  
  特殊字符"." (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。
  
  PHP的正规表达式有一些内置的通用字符簇,列表如下:
  
  字符簇 含义
  [[:alpha:]] 任何字母
  [[:digit:]] 任何数字
  [[:alnum:]] 任何字母和数字
  [[:space:]] 任何白字符
  [[:upper:]] 任何大写字母
  [[:lower:]] 任何小写字母
  [[:punct:]] 任何标点符号
  [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]
  
  到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。
  
  字符簇 含义
  ^[a-zA-Z_]$ 所有的字母和下划线
  ^[[:alpha:]]$ 所有的单个字母的单词
  ^a$ 字母a
  ^a{4,4}$ aaaa
  ^a{2,4}$ aa,aaa或aaaa
  ^a{1,3}$ a,aa或aaa
  ^a{2,}$ 包含多于两个a的字符串
  ^a{2,} 如:aardvark和aaab,但apple不行
  a{2,} 如:baad和aaa,但Nantucket不行
  \t 至少一个制表符
  . 至少一个字符
  
  这些例子描述了花括号的三种不同的用法。一个数字,的意思是“前面的字符或字符簇只出现x次”;一个数字加逗号,{x,}的意思是“前面的内容出现x 或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现x次,但不超过y次”。我们可以把模式扩展到更多的单词或数字:
  
  ^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串
  ^[0-9]{1,}$ //所有的正数
  ^\-{0,1}[0-9]{1,}$ //所有的整数
  ^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小数
  
  最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(\-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一 个可选的小数点(\.{0,1})再跟上0个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。
  
  特殊字符"?"与{0,1}是相等的,它们都代表着:“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为:
  
  ^\-?[0-9]{0,}\.?[0-9]{0,}$
  
  特殊字符"*"与{0,}是相等的,它们都代表着“0个或多个前面的内容”。最后,字符"+"与 {1,}是相等的,表示“1个或多个前面的内容”,所以上面的4个例子可以写成:
  
  ^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串
  ^[0-9]+$ //所有的正数
  ^\-?[0-9]+$ //所有的整数
  ^\-?[0-9]*\.?[0-9]*$ //所有的小数
  
  当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。

正则表达式中的特殊字符

  字符\
  意义:对于字符,通常表示按字面意义,指出接着的字符为特殊字符,不作解释。
  例如:/b/匹配字符’b’,通过在b 前面加一个反斜杠,也就是/\b/,则该字符变成特殊字符,表示
  匹配一个单词的分界线。
  或者:
  对于几个字符,通常说明是特殊的,指出紧接着的字符不是特殊的,而应该按字面解释。
  例如:*是一个特殊字符,匹配任意个字符(包括0个字符);例如:/a*/意味匹配0个或多个a。为了匹配字面上的*,在a前面加一个反斜杠;例如:/a\*/匹配’a*’。
  
  字符^
  意义:表示匹配的字符必须在最前边。
  例如:/^A/不匹配"an A,"中的’A’,但匹配"An A."中最前面的’A’。
  
  字符$
  意义:与^类似,匹配最末的字符。
  例如:/t$/不匹配"eater"中的’t’,但匹配"eat"中的’t’。
  
  字符*
  意义:匹配*前面的字符0次或n次。
  例如:/bo*/匹配"A ghost booooed"中的’boooo’或"A bird warbled"中的’b’,但不匹配"Agoat g//要以b在o前面
  runted"中的任何字符。
  
  字符+
  意义:匹配+号前面的字符1次或n次。等价于{1,}。
  例如:/a+/匹配"candy"中的’a’和"caaaaaaandy."中的所有’a’。
  
  字符?
  意义:匹配?前面的字符0次或1次。
  例如:/e?le?/匹配"angel"中的’el’和"angle."中的’le’。
  
  字符.
  意义:(小数点)匹配除换行符外的所有单个的字符。
  例如:/.n/匹配"nay, an apple is on the tree"中的’an’和’on’,但不匹配’nay’。
  
  
  字符(x)
  意义:匹配’x’并记录匹配的值。
  例如:/(foo)/匹配和记录"foo bar."中的’foo’。匹配子串能被结果数组中的素[1], ...,[n] 返
  回,或被RegExp对象的属性, ..., 返回。
  
  字符x│y
  意义:匹配’x’或者’y’。
  例如:/green│red/匹配"green apple"中的’green’和"red apple."中的’red’。
  
  字符{ n }
  意义:这里的n是一个正整数。匹配前面的n个字符。
  例如:/a{ 2 }/不匹配"candy,"中的’a’,但匹配"caandy," 中的所有’a’和"caaandy."中前面的两个’a’。
  
  字符{ n, }
  意义:这里的n是一个正整数。匹配至少n个前面的字符。
  例如:/a{ 2, }不匹配"candy"中的’a’,但匹配"caandy"中的所有’a’和"caaaaaaandy."中的所有’a’
  
  字符{ n,m }
  意义:这里的n和m都是正整数。匹配至少n个最多m个前面的字符。
  例如:/a{ 1,3 }/不匹配"cndy"中的任何字符,但匹配 "candy,"中的’a’,"caandy," 中的前面两个
  ’a’和"caaaaaaandy"中前面的三个’a’,注意:即使"caaaaaaandy" 中有很多个’a’,但只匹配前面的三 个’a’即"aaa"。
  
  字符[xyz]
  意义:一字符列表,匹配列出中的任一字符。你可以通过连字符-指出一个字符范围。
  例如:[abcd]跟[a-c]一样。它们匹配"brisket"中的’b’和"ache"中的’c’。
  
  字符[^xyz]
  意义:一字符补集,也就是说,它匹配除了列出的字符外的所有东西。 你可以使用连字符-指出一 字符范围。
  例如:[^abc]和[^a-c]等价,它们最早匹配"brisket"中的’r’和"chop."中的’h’。
  
  字符
  意义:匹配一个空格(不要与b混淆)
  
  字符b
  意义:匹配一个单词的分界线,比如一个空格(不要与混淆)
  例如:/bnw/匹配"noonday"中的’no’,/wyb/匹配"possibly yesterday."中的’ly’。
  
  字符B
  意义:匹配一个单词的非分界线
  例如:/wBn/匹配"noonday"中的’on’,/yBw/匹配"possibly yesterday."中的’ye’。
  
  字符cX
  意义:这里的X是一个控制字符。匹配一个字符串的控制字符。
  例如:/cM/匹配一个字符串中的control-M。
  
  字符d
  意义:匹配一个数字,等价于[0-9]。
  例如:/d/或/[0-9]/匹配"B2 is the suite number."中的’2’。
  
  字符D
  意义:匹配任何的非数字,等价于[^0-9]。
  例如:/D/或/[^0-9]/匹配"B2 is the suite number."中的’B’。
  
  字符f
  意义:匹配一个表单符
  
  字符n
  意义:匹配一个换行符
  
  字符r
  意义:匹配一个回车符
  
  字符s
  意义:匹配一个单个white空格符,包括空格,tab,form feed,换行符,等价于[ fnrtv]。
  例如:/sw*/匹配"foo bar."中的’ bar’。
  
  字符S
  意义:匹配除white空格符以外的一个单个的字符,等价于[^ fnrtv]。
  例如:/S/w*匹配"foo bar."中的’foo’。
  
  字符t
  意义:匹配一个制表符
  
  字符v
  意义:匹配一个顶头制表符
  
  字符w
  意义:匹配所有的数字和字母以及下划线,等价于[A-Za-z0-9_]。
  例如:/w/匹配"apple,"中的’a’,".28,"中的’5’和"3D."中的’3’。
  
  字符W
  意义:匹配除数字、字母外及下划线外的其它字符,等价于[^A-Za-z0-9_]。
  例如:/W/或者/[^$A-Za-z0-9_]/匹配"50%."中的’%’。
  
  字符n
  意义:这里的n是一个正整数。匹配一个正则表达式的最后一个子串的n的值(计数左圆括号)。
  
  例如:/apple(,)sorange1/匹配"apple, orange, cherry, peach."中的’apple, orange’,下面有一个更加完整的例子。
  注意:如果左圆括号中的数字比n指定的数字还小,则n取下一行的八进制escape作为描述。
  
  字符ooctal和xhex
  意义:这里的ooctal是一个八进制的escape值,而xhex是一个十六进制的escape值,允许在一个正则表达式中嵌入ASCII码

2012-1-30 17:20 Monday  

因为系统不一样,所以在set_include_path的时候,分隔符是不一样的,win是; 非win是:

可以用 PATH_SEPARATOR 获得当前系统的分隔符

真实目录获取可以采用 dirname( (__FILE__) ) 获得

2012-1-30 17:17 Monday  
<?php
/**
 * Mysql数据库操作类 v2.0
 * 2009.1.22 by Aboc QQ:9986584
 * 增加文件缓存
 *
 */
class DbMysql {
    /**
     * 在数据库操作中,只对数据库操作有影响的字符做转义
     * 当此类正常后,所有数据操作 @
     */

    /*
     * 数据库连接句柄
     */
    private $_Db = NULL;

    /*
     * 是否持续连接 0.1
     */
    private $_pconnect = 0;

    /*
     * 编码
     */
    private $_charset = 'gbk';
    
    
    /*
     *最后一次插入的ID
     */
     private $_lastId = 0;

    /*
     * 默认数据库配置
     */
    private $_config = array ('dbhost' => 'localhost', 'dbuser' => 'root', 'dbpass' => 'root', 'dbname' => 'test');
    
    /**
     * 缓存路径
     */
    private $_cachePath = '';
    
    /**
     * sql语句
     *
     * @var unknown_type
     */
    private $_sql = '';

    /**
     * 初始连接数据库
     */
    function __construct($config,$pconnect=0,$cachepath='cache') {
        if (empty($config)) $config = array();
        $this->checkConfig ( $config );
        $this->_pconnect = $pconnect;
        $this->connect ();
        $this->query ( 'set names ' . $this->_charset ); //设置编码
        $this->_cachePath = $cachepath;
    }

    /**
     * 判断config变量
     *
     * @param unknown_type $config
     */
    private function checkConfig($config) {
        foreach ( $config as $key => $value ) {
            $this->_config [$key] = empty ( $value ) ? $this->_config [$key] : $value;
        }
        //return $this->_config;
    }

    /*
     * 连接数据库
     */
    private function connect() {
//        print_r($this->_config);
        if ($this->_pconnect) {
            $this->_Db = mysql_pconnect ( $this->_config ['dbhost'], $this->_config ['dbuser'], $this->_config ['dbpass'] ) or die ( '数据库连接失败' . mysql_errno () );
        } else {
            $this->_Db = mysql_connect ( $this->_config ['dbhost'], $this->_config ['dbuser'], $this->_config ['dbpass'] ) or die ( '数据库连接失败' . mysql_errno () );
        }
        if ($this->_Db != NULL) {
            mysql_select_db ( $this->_config ['dbname'], $this->_Db ) or die ( '数据库' . $this->_config ['dbname'] . '不存在' );
        }
    }

    /**
     * 将变量的单引号或双引号转义
     *
     * @param unknown_type $string
     */
    private function strtag($string1) {
            if (is_array ( $string1 )) {
                foreach ( $string1 as $key => $value ) {
                    $stringnew [$this->strtag ( $key )] = $this->strtag ( $value );
                }
            } else {
                //在此做转义,对单引号
                //TODO 好像 %也要转义吧?
                //$string = iconv("gbk","gbk",$string);
                $stringnew = mysql_real_escape_string ( $string1 );
//                $stringnew = get_magic_quotes_gpc()?$string:addslashes ( $string1 );
//                $stringnew=str_replace(array("'",'"'),array("\'",'\"'),$string1);
            }
        return $stringnew;
    }

    /**
     * 将数组转化为SQL接受的条件样式
     *
     * @param unknown_type $array
     */
    private function chageArray($array) {
        //MYSQL支持insert into joincart set session_id = 'dddd',product_id='44',number='7',jointime='456465'
        //所以更新和插入可以使用同一组数据
        $array = $this->strtag ( $array ); //转义
        $str = '';
        foreach ( $array as $key => $value ) {
            $str .= empty ( $str ) ? "`" . $key . "`='" . $value."'" : ", `" . $key . "`='" . $value."'";
        }
        return $str;
    }

    /**
     * 执行查询语句
     * @return bool
     */
    public function query($sql) {
        //echo $sql.'<br>';
        $this->_sql = $sql;
        if (! $result = mysql_query ( $sql, $this->_Db)) {
            if(UC_DBUSER == 'root'){
                echo $sql.'<br>'.mysql_error().'<br>';
                //$this->createErrorLog($sql);
                die ( '数据库出错' );
            } else {
                 $subject = date("Y-m-d H:i:s")."数据库查询出错";
                 $thisurl = str::getThisUrl();
                 $error = mysql_error();
                 $content = <<<EOT
数据库查询出错,详细如下:<br />
$thisurl <br />
$error <br />
$sql
EOT;
                 $username = '风子';
                 if (function_exists('sendMail')){
                     sendMail('9986584@qq.com',$username,$subject,$content);
                    die(':(&nbsp;数据库查询出错,已经通知管理员,请稍后重试');
                 }
            }
        } else {
            return $result;
        }
    }


    /**
     * 插入记录
     *
     */
    public function insert($table, $array) {
        if(!is_array($array))return false;
        $array = $this->strtag ( $array ); //转义
        $str = '';
        $val = '';
        foreach ($array as $key=>$value){
            $str .= ($str != '')?",`$key`":"`$key`";
            $val .= ($val != '')?",'$value'":"'$value'";
        }
        $sql = 'insert into `' . $table . '` ('.$str. ') values('.$val.')';
                //echo $sql;exit;
        if ($this->query ( $sql )) {
            $this->lastId();
            return $this->_lastId?$this->_lastId:true;
        } else {
            return false;
        }
    }
    
    
    /**
     * 替换并插入
     * @param unknown_type $table
     * @param unknown_type $array
     */
    public function replaceInsert($table, $array) {
        if(!is_array($array))return false;
        $array = $this->strtag ( $array ); //转义
        $str = '';
        $val = '';
        foreach ($array as $key=>$value){
            $str .= ($str != '')?",`$key`":"`$key`";
            $val .= ($val != '')?",'$value'":"'$value'";
        }
        $sql = 'replace into `' . $table . '` ('.$str. ') values('.$val.')';
        if ($this->query ( $sql )) {
            $this->lastId();
            return $this->_lastId?$this->_lastId:true;
        } else {
            return false;
        }
    }
    
    /**
     * 批量插入记录
     *
     * @param $table 表名  
     * @param $batchArray 批量数据 ,二维数组,健名必需相同,否则不能插入
     */
    public function insertBatch($table,$batchArray){
        if(!is_array($batchArray))return false;
        $str = '';
        $val = '';
        $vals = array();
        foreach ($batchArray as $keys=>$row){
            if(!is_array($row))return false;
            foreach ($row as $key=>$value){
                if($keys == 0)$str .= ($str != '')?",`$key`":"`$key`";
                $val .= ($val != '')?",'$value'":"'$value'";
            }
            $vals[$keys] = '('.$val.')';
            $val = '';
        }
        $vals = implode(',',$vals);
        $sql = 'insert into `' . $table . '` ('.$str. ') values '.$vals;
        if ($this->query ( $sql )) {
            $this->lastId();
            return $this->_lastId?$this->_lastId:true;
        } else {
            return false;
        }
        
    }

    /**
     * 更新记录
     *
     */
    public function update($table, $array, $where = NULL) {
        if ($where == NULL) {
            $sql = 'update `' . $table . '` set ' . $this->chageArray ( $array );
        } else {
            $sql = 'update `' . $table . '` set ' . $this->chageArray ( $array ) . ' where ' . $where;
        }
        if ($res = $this->query ( $sql )) {
            return $res;
        } else {
            return false;
        }
    }

    /**
     * 删除记录
     *
     */
    public function delete($table, $where = NULL) {
        if ($where == NULL) {
            $sql = 'delete from `' . $table . '`';
        } else {
            $sql = 'delete from `' . $table . '` where ' . $where;
        }
        if ($this->query ( $sql )) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获取一条记录
     *
     */
    public function fetchRow($sql,$cacheTime=0,$cacheId='') {
        if($content = $this->checkCache($sql,$cacheTime,$cacheId)){
            return $content;
        } else{
            $reult = $this->query ( $sql );
            $row = mysql_fetch_assoc ( $reult );
            if(!empty($row)){
                foreach ($row as $key=>$value){
                    $row[$key] = stripslashes($value);
                }
            }
        if($cacheTime)$this->createCache($sql,$row,$cacheId);
        return $row;
        }
    }

    /**
     * 获取所有记录/用的mysql_fetch_assoc循环
     *
     */
    public function fetchAll($sql,$cacheTime=0,$cacheId='') {
        if($content = $this->checkCache($sql,$cacheTime,$cacheId)){
            return $content;
        } else{
            $result = $this->query ( $sql );
            if ($result !== false) {
                $arr = array ();
                while ( $row = mysql_fetch_assoc ( $result ) ) {
                    if(!empty($row)){
                        foreach ($row as $key=>$value){
                            $row[$key] = stripslashes($value);
                        }
                    }
                    $arr [] = $row;
                }
                if($cacheTime)$this->createCache($sql,$arr,$cacheId);
                return $arr;
            } else {
                return array();
            }
        }
    }
    
    /**
     * 获取最后一次影响的Id
     *
     */
    public function lastId() {
        $this->_lastId = mysql_insert_id ( $this->_Db );
        return $this->_lastId;
    }

    /**
     * 获取符合条件的记录数
     *
     */
    public function fetchNum($sql) {
        $reult = $this->query ( $sql );
        $num = mysql_num_rows ( $reult );
        return $num;
    }

    /**
     * 输出适合的where语句
     */
    public function quoteInto($string,$value ) {
        $value = $this->strtag($value);
        if(is_numeric($value)){
            $string = str_replace('?',$value,$string);
        }else{
            $string = str_replace('?',"'".$value."'",$string);
        }
        return $string;
    }
    
    /**
     * 数据数据库所用大小
     *
     * @param unknown_type $dbname
     * @return unknown
     */
    public function getSqlSize($dbname){
        $sql = "SHOW TABLE STATUS from $dbname";
        $rows = $this->fetchAll($sql);
        $total = 0;
        foreach ($rows as $row){
            $total +=  $row['Data_length'];
            $total +=  $row['Index_length'];
        }
        return round($total/(1024*1024),2);
    }
    
    /**
     * 判断缓存文件是否有效,如果有效,则返回缓存内容
     */
    private function checkCache($sql,$cacheTime = 0,$cacheId=''){
        //不缓存,直接返回
        return false;
        if($cacheTime == 0){
            return false;
        } else {
            $tmp = $this->createFilename($sql,$cacheId);
            if(file_exists($tmp['path'].$tmp['filename'])&&(filemtime($tmp['path'].$tmp['filename'])+$cacheTime)>time()){
                $content = file_get_contents($tmp['path'].$tmp['filename']);
                return !empty($content)?unserialize($content):array();
            } else{
                return false;
            }
        }
        
    }
    
    /**
     * 生成缓存
     */
    private function createCache($sql,$data,$cacheId=''){
        return;
        $tmp = $this->createFilename($sql,$cacheId);
        if(!is_dir($tmp['path']))@mkdir($tmp['path'],0777,true);
        @file_put_contents($tmp['path'].$tmp['filename'],serialize($data));
    }
    
    /**
     * 根据sql语句生成文件名及路径
     */
    private function createFilename($sql,$cacheId=''){
        if(!empty($cacheId))$sql = $cacheId;
        $data = array(
                    'path'    => $this->_cachePath.'sql/',
                    'filename'=> ''
                );
        if(empty($sql)) return $data;
        $tmpName = md5($sql);
        $data = array(
                    'path'    => $this->_cachePath.'sql/'.substr($tmpName,0,2).'/'.substr($tmpName,2,2).'/',
                    'filename'=> substr($tmpName,3).'.tmp'
                );
        return $data;
    }
    
    /**
     * 清除缓存
     *
     * 条件为空则清除所有缓存
     *
     * @return DbMysql
     */
    public function clearCache($sql='',$cacheId=''){
        $data = $this->createFilename($sql,$cacheId);
        $times = time();
        if(!empty($sql) || !empty($cacheId)){
            if(!empty($data['filename'])){
                $path1= $data['path'].$data['filename'];
                if(file_exists($path1) && filemtime($path1)<$times)@unlink($path1);
            }            
        }
        //清除所有缓存
        else{
            $this->clearFile($this->_cachePath,$times);
        }
        return true;
    }

    /**
     * 遍历删除文件及目录
     */
    private function clearFile($cachePath,$times){
        $list = scandir($cachePath);
        foreach ($list as $key1=>$row1){
            if($key1<=1)continue;
            $path1 = $cachePath.'/'.$row1;
            if(is_dir($path1)){
                $this->clearFile($path1,$times);            
                //rmdir($path1);                
            } else {
                if(file_exists($path1) && filemtime($path1)<$times)@unlink($path1);
            }        
        }    
    }

    /**
     * 写错误日志
     *
     * @param unknown_type $log
     */
    private function createErrorLog($sql){
        $log = array(
                    date("Y-m-d H:i:s"),
                    str::getThisUrl(),
                    $sql,
                    mysql_error ()
                );                
        $log = implode(' - ',$log)."\r\n";
        $filename = $this->_cachePath.'error/'.date("Y-m").'.txt';
        if(!$fp = fopen($filename,'a+')){
            echo '错误日志打开失败,请联络QQ:9986584';
        }
        if( fwrite($fp,$log) === FALSE ){
            echo '错误日志写入失败,请联络QQ:9986584';
        }
        fclose($fp);        
    }
    
    /**
     * 获取最后一次执行的sql语句
     *
     */
    public function getLastSql(){
        return $this->_sql;
    }
        
        /**
         * 获取数据库中所有的表
         * @param type $dbname
         * @return type
         */
        function fetchAllTable($dbname=''){
            $dbname = !empty($dbname)?$dbname:$this->_config['dbname'];
            $list = array();
            $result = mysql_list_tables($dbname);
            if($result){
                while ($row = mysql_fetch_row($result)){
                    $list[] = $row[0];
                }
                return $list;
            }
            else
                return array();
        }
        
        /**
         * 获取最后一次影响的记录数
         * @return type
         */
        function fetchChangeRow(){
            return  mysql_affected_rows();
        }
    

    /**
     * 释放查询结果
     */
    private function free() {
        mysql_free_result($this->_Db);
    }

    /**
     *
     */
    function __destruct() {
//        $this->free();
    }
}

?>

2012-1-30 11:38 Monday  

今天在想办法在windows下怎么来获得唯一标识一台服务器的方法,很多人都 知道,一台电脑可以唯一标识的是网卡的物理地址,可以很多了讨论过了没看了有什么结果可以取到它。我们首先找到win32API这个扩展,它最初是用来允 许从 PHP 中访问 Win32 API。但是很遗憾查到php手册“(4.2.0 - 4.2.3 only)”,我们现在的版本远比这个高,无法使用这个扩展只好放弃。后来查看phpinfo,找到环境变量可以用$_ENV获得,一台电脑的环境变量一 般不可以所有都一样,所以得到结果:一些可以标识计算机特点的变量组合就可以用一唯一标识一台电脑。 如:_ENV["PROCESSOR_IDENTIFIER"]处理器标识符,_ENV["PROCESSOR_REVISION"]处理器修定版 号,_ENV["AP_PARENT_PID"],_ENV["COMPUTERNAME"]计算机名。

_ENV[”PROCESSOR_REVISION”] 0401
_ENV[”ProgramFiles”] C:\Program Files
_ENV[”SystemDrive”] C:
_ENV[”SystemRoot”] C:\WINDOWS
_ENV[”TEMP”] d:\
_ENV[”TMP”] d:\
_ENV[”USERPROFILE”] C:\Documents and Settings\Default User
_ENV[”windir”] C:\WINDOWS
Ruby的ENV变量讲解
可以取得CPU数量,用户名,OS系统等相关信息。

1)所有用户的简报:ENV['ALLUSERSPROFILE']
2)应用程序数据:ENV['APPDATA']
3)ICONV路径:ENV['APR_ICONV_PATH']
4)客户端名称:ENV['CLIENTNAME']
5)通用程序文件:ENV['CommonProgramFiles']
6)计算机名:ENV['COMPUTERNAME']
7)指定命令行:ENV['ComSpec']
8)FP_NO_HOST_CHECK: ENV['FP_NO_HOST_CHECK']
9)主驱动:ENV['HOMEDRIVE']
10)主目录: ENV['HOMEPATH']
11)登陆的服务器:ENV['LOGONSERVER']
12)系统的CPU数量:ENV['NUMBER_OF_PROCESSORS']
13)系统的操作系统:ENV['OS']
14)系统的路径:ENV['PATH']
15)系统的路径执行扩展名顺序:ENV['PATHEXT']
16)CPU架构:ENV['PROCESSOR_ARCHITECTURE']
17)CPU的身份ID: ENV['PROCESSOR_IDENTIFIER']
18)CPU的级别: ENV['PROCESSOR_LEVEL']
19)CPU的版本:ENV['PROCESSOR_REVISION']
20)程序文件目录: ENV['ProgramFiles']
21)提示符号: ENV['PROMPT']
22)RUBY选项: ENV['RUBYOPT']

2012-1-30 11:36 Monday  
<?php
//第一个
;
$patterns = "/\.[a-zA-Z0-9]{3,4}/i";
$abc = preg_replace($patterns,"",$abc);
echo $abc."<br>";
//第二个
$abc = "asdflkjlkasd.jpgaaaa";
$abc = pathinfo($abc);
print_r($abc);
echo "<br>";
//第三个
$abc = "asdflkjlkasd.jpgaaaa";
echo strrchr($abc, ".")."<br>";
echo substr(strrchr($abc, "."), 1)."<br>";
//第四个
$abc = "asdflkjlkasd.jpg";
$patterns = "/\.([a-zA-Z0-9]{3,4})$/i";

if(preg_match($patterns,$abc,$ms)){
print_r($ms);
}
echo "<br>";
//第五个
$abc = "asdflkjlkasd.jpg";
$ps=split("\.",$abc);
$abc=$ps[count($ps)-1];
echo $abc."\n";

//第六个
$abc = "asdflkjlkasd.jpg";
$p = '/\.[a-z0-9]+$/i';
preg_match_all($p, $abc, $result);
print_r($result[0][0]);
?>
结果
第一个:
asdflkjlkasd
第二个:

Array (
[dirname] => .
[basename] => asdflkjlkasd.jpgaaaa
[extension] => jpgaaaa
[filename] => asdflkjlkasd
)
第三个:
.jpgaaaa
jpgaaaa
第四个:

Array ( [0] => .jpg [1] => jpg )
第五个:
jpg
$abc = "asdflkjlkasd.jpg"