﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-无所惧，无所悔,为梦想执着的拼搏-文章分类-PHP技术文档</title><link>http://www.blogjava.net/DreamFight/category/36569.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 06 Dec 2010 15:20:01 GMT</lastBuildDate><pubDate>Mon, 06 Dec 2010 15:20:01 GMT</pubDate><ttl>60</ttl><item><title>php正则表达式</title><link>http://www.blogjava.net/DreamFight/articles/339704.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Fri, 03 Dec 2010 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/339704.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/339704.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/339704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/339704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/339704.html</trackback:ping><description><![CDATA[<div class="sum">
<ul class="summary">
    PHP正则表达式，作为一种快速、便捷的处理字符串的工具，在各种编程语言中都有着广泛的用途，通过在PHP中的一些使用，下面记录一下关于PHP正则表达式的一些相关技巧。
</ul>
</div>
<p>PHP正则表达式主要用于字符串的模式分割、匹配、查找及替换操作。使用正则表达式在某些简单的环境下可能效率不高，因此如何更好的使用PHP正则表达式需要综合考虑</p>
<p>我的PHP正则入门，是起源于网上的一篇文章[1]，这篇文章由浅入深的阐述了PHP正则表达式使用的方法，我觉得是一个很好的入门材料，不过学成
还是要靠个人，在使用的过程中，还是会不断地忘记，因此反反复复的阅读了这篇文章有四五遍，对于其中一些比较困难的知识点，甚至要用很久才能消化，但是只
要能见坚持着看完，你会发现自己对于正则的运用能力就会显著提高。51CTO编辑推荐《<a href="http://developer.51cto.com/art/200810/94162.htm"><span style="color: #0000ff;">PHP开发基础入门</span></a>》</p>
<p><strong>PHP正则表达式的定义：</strong></p>
<p>用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。</p>
<p>PHP中的正则函数：</p>
<p>PHP中有两套正则函数，两者功能差不多，分别为：</p>
<p>一套是由PCRE（Perl Compatible Regular Expression）库提供的。使用&#8220;preg_&#8221;为前缀命名的函数；</p>
<p>一套由POSIX（Portable Operating System Interface of Unix ）扩展提供的。使用以&#8220;ereg_&#8221;为前缀命名的函数；（POSIX的正则函数库，自PHP 5.3以后，就不在推荐使用，从PHP6以后，就将被移除）</p>
<p>由于POSIX正则即将推出历史舞台，并且PCRE和perl的形式差不多，更利于我们在perl和php之间切换，所以这里重点介绍PCRE正则的使用。</p>
<p><strong>PCRE正则表达式</strong></p>
<p>PCRE全称为Perl Compatible Regular Expression，意思是Perl兼容正则表达式。 </p>
<p>在PCRE中，通常将模式表达式（即正则表达式）包含在两个反斜线&#8220;/&#8221;之间，如&#8220;/apple/&#8221;。</p>
<p>正则中重要的几个概念有：元字符、转义、模式单元（重复）、反义、引用和断言，这些概念都可以在文章[1]中轻松的理解和掌握。</p>
<p><strong>常用的元字符(Meta-character)：</strong></p>
<p>元字符&nbsp;&nbsp;&nbsp;&nbsp; 说明 </p>
<p>\A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配字符串串首的原子 </p>
<p>\Z&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配字符串串尾的原子 </p>
<p>\b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配单词的边界&nbsp;&nbsp;&nbsp;&nbsp; /\bis/&nbsp;&nbsp; 匹配头为is的字符串&nbsp;&nbsp; /is\b/&nbsp;&nbsp; 匹配尾为is的字符串&nbsp;&nbsp; /\bis\b/ 定界 </p>
<p>\B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配除单词边界之外的任意字符&nbsp;&nbsp; /\Bis/&nbsp;&nbsp; 匹配单词&#8220;This&#8221;中的&#8220;is&#8221;</p>
<p>\d&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个数字；等价于[0-9] </p>
<p>\D&nbsp;&nbsp;&nbsp;&nbsp; 匹配除数字以外任何一个字符；等价于[^0-9] </p>
<p>\w&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个英文字母、数字或下划线；等价于[0-9a-zA-Z_] </p>
<p>\W&nbsp;&nbsp;&nbsp;&nbsp; 匹配除英文字母、数字和下划线以外任何一个字符；等价于[^0-9a-zA-Z_] </p>
<p>\s&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个空白字符；等价于[\f\t\v] </p>
<p>\S&nbsp;&nbsp;&nbsp;&nbsp; 匹配除空白字符以外任何一个字符；等价于[^\f\t\v] </p>
<p>\f&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个换页符等价于 \x0c 或 \cL </p>
<p>\n&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个换行符；等价于 \x0a 或 \cJ </p>
<p>\r&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个回车符等价于\x0d 或 \cM </p>
<p>\t&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个制表符；等价于 \x09\或\cl </p>
<p>\v&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个垂直制表符；等价于\x0b或\ck </p>
<p>\oNN&nbsp;&nbsp; 匹配一个八进制数字 </p>
<p>\xNN&nbsp;&nbsp; 匹配一个十六进制数字 </p>
<p>\cC&nbsp;&nbsp;&nbsp; 匹配一个控制字符</p>
<p>模式修正符（Pattern Modifiers）： </p>
<p>模式修正符在忽略大小写、匹配多行中使用特别多，掌握了这一个修正符，往往能解决我们遇到的很多问题。</p>
<p>i&nbsp;&nbsp;&nbsp;&nbsp; －可同时匹配大小写字母 </p>
<p>M&nbsp;&nbsp;&nbsp;&nbsp; －将字符串视为多行 </p>
<p>S&nbsp;&nbsp;&nbsp;&nbsp; －将字符串视为单行，换行符做普通字符看待，使&#8220;.&#8221;匹配任何字符 </p>
<p>X&nbsp;&nbsp;&nbsp;&nbsp; －模式中的空白忽略不计&nbsp;&nbsp;&nbsp; </p>
<p>U&nbsp;&nbsp;&nbsp;&nbsp; －匹配到最近的字符串 </p>
<p>e&nbsp;&nbsp;&nbsp;&nbsp; －将替换的字符串作为表达使用 </p>
<p>格式：/apple/i匹配&#8220;apple&#8221;或&#8220;Apple&#8221;等，忽略大小写。&nbsp;&nbsp;&nbsp;&nbsp; /i</p>
<p>PCRE的模式单元：</p>
<p>//1 提取第一位的属性 </p>
<p>/^\d{2} ([\W])\d{2}\\1\d{4}$匹配&#8220;12-31-2006&#8221;、&#8220;09/27/1996&#8221;、&#8220;86 01
4321&#8221;等字符串。但上述正则表达式不匹配&#8220;12/34-5678&#8221;的格式。这是因为模式&#8220;[\W]&#8221;的结果&#8220;/&#8221;已经被存储。下个位置&#8220;\1&#8221;引用
时，其匹配模式也是字符&#8220;/&#8221;。</p>
<p>当不需要存储匹配结果时使用非存储模式单元&#8220;（？：）&#8221; </p>
<p>例如/(?:a|b|c)(D|E|F)\\1g/ 将匹配&#8220;aEEg&#8221;。在一些正则表达式中，使用非存储模式单元是必要的。否则，需要改变其后引用的顺序。上例还可以写成/（a|b|c）(C|E|F)\2g/。</p>
<p>PCRE正则表达式函数：</p>
<pre>
<ol class="dp-c">
    <li class="alt"><span><span>preg_match()和preg_match_all() &nbsp;</span></span></li>
    <li><span>preg_quote() &nbsp;</span></li>
    <li class="alt"><span>preg_split() &nbsp;</span></li>
    <li><span>preg_grep() &nbsp;</span></li>
    <li class="alt"><span>preg_replace()&nbsp;</span></li>
</ol>
</pre>
<p>函数的具体使用，我们可以通过PHP手册来找到，下面分享一些平时积累的正则表达式：</p>
<p>匹配action属性&nbsp;</p>
<pre>
<ol class="dp-c">
    <li class="alt"><span><span class="vars"><span style="color: #dd0000;">$str</span></span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff;">''</span></span><span>; &nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars"><span style="color: #dd0000;">$match</span></span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff;">''</span></span><span>; &nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;preg_match_all(</span><span class="string"><span style="color: #0000ff;">'/\s+action=\"(?!http:)(.*?)\"\s/'</span></span><span>,&nbsp;</span><span class="vars"><span style="color: #dd0000;">$str</span></span><span>,&nbsp;</span><span class="vars"><span style="color: #dd0000;">$match</span></span><span>); &nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;print_r(</span><span class="vars"><span style="color: #dd0000;">$match</span></span><span>);&nbsp;</span></li>
</ol>
</pre>
<p>在正则中使用回调函数 </p>
<pre>
<ol class="dp-c">
    <li class="alt"><span><span class="comment"><span style="color: #008200;">/** </span></span>&nbsp;</span></li>
    <li><span><span class="comment"><span style="color: #008200;">&nbsp;&nbsp;&nbsp;*&nbsp;replace&nbsp;some&nbsp;string&nbsp;by&nbsp;callback&nbsp;function </span></span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment"><span style="color: #008200;">&nbsp;&nbsp;&nbsp;* </span></span>&nbsp;</span></li>
    <li><span><span class="comment"><span style="color: #008200;">&nbsp;&nbsp;&nbsp;*/</span></span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #006699;">function</span></strong></span><span>&nbsp;callback_replace()&nbsp;{ &nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars"><span style="color: #dd0000;">$url</span></span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff;">'http://esfang.house.sina.com.cn'</span></span><span>; &nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars"><span style="color: #dd0000;">$str</span></span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff;">''</span></span><span>; &nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="vars"><span style="color: #dd0000;">$str</span></span><span>&nbsp;=&nbsp;preg_replace&nbsp;(&nbsp;</span><span class="string"><span style="color: #0000ff;">'/(?&lt;=\saction=\")(?!http:)(.*?)(?=\"\s)/e'</span></span><span>,&nbsp;</span><span class="string"><span style="color: #0000ff;">'search(\$url,&nbsp;\\1)'</span></span><span>,&nbsp;</span><span class="vars"><span style="color: #dd0000;">$str</span></span><span>&nbsp;); &nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="vars"><span style="color: #dd0000;">$str</span></span><span>; &nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #006699;">function</span></strong></span><span>&nbsp;search(</span><span class="vars"><span style="color: #dd0000;">$url</span></span><span>,&nbsp;</span><span class="vars"><span style="color: #dd0000;">$match</span></span><span>){ &nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #006699;">return</span></strong></span><span>&nbsp;</span><span class="vars"><span style="color: #dd0000;">$url</span></span><span>&nbsp;.&nbsp;</span><span class="string"><span style="color: #0000ff;">'/'</span></span><span>&nbsp;.&nbsp;</span><span class="vars"><span style="color: #dd0000;">$match</span></span><span>; &nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;</span></li>
</ol>
</pre>
<p>带断言的正则匹配</p>
<pre>
<ol class="dp-c">
    <li class="alt"><span><span class="vars"><span style="color: #dd0000;">$match</span></span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff;">''</span></span><span>; &nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="vars"><span style="color: #dd0000;">$str</span></span><span>&nbsp;=&nbsp;</span><span class="string"><span style="color: #0000ff;">'xxxxxx.com.cn&nbsp;<strong>bold&nbsp;font</strong>&nbsp;
    <p>paragraph&nbsp;text</p>
    '</span></span><span>; &nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;preg_match_all&nbsp;(&nbsp;</span><span class="string"><span style="color: #0000ff;">'/(?&lt;=&lt;(\w{1})&gt;).*(?=&lt;\/\1&gt;)/'</span></span><span>,&nbsp;</span><span class="vars"><span style="color: #dd0000;">$str</span></span><span>,&nbsp;</span><span class="vars"><span style="color: #dd0000;">$match</span></span><span>&nbsp;); &nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="func">echo</span><span>&nbsp;</span><span class="string"><span style="color: #0000ff;">"匹配没有属性的HTML标签中的内容："</span></span><span>; &nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;print_r&nbsp;(&nbsp;</span><span class="vars"><span style="color: #dd0000;">$match</span></span><span>&nbsp;);&nbsp;</span></li>
</ol>
</pre>
<p>替换HTML源码中的地址&nbsp;&nbsp;&nbsp; </p>
<pre>
<ol class="dp-c">
    <li class="alt"><span><span class="vars"><span style="color: #dd0000;">$form_html</span></span><span>&nbsp;=&nbsp;preg_replace&nbsp;(&nbsp;</span><span class="string"><span style="color: #0000ff;">'/(?&lt;=\saction=\"|\ssrc=\"|\shref=\")(?!http:|javascript)(.*?)(?=\"\s)/e'</span></span><span>,&nbsp;</span><span class="string"><span style="color: #0000ff;">'add_url(\$url,&nbsp;\'\\1\')'</span></span><span>,&nbsp;</span><span class="vars"><span style="color: #dd0000;">$form_html</span></span><span>&nbsp;);&nbsp;</span></span></li>
</ol>
</pre>
<p>最后，正则工具虽然强大，但是从效率和编写时间上来讲，有的时候可能没有explode来的更直接，对于一些紧急或者要求不高的任务，简单、粗暴的方法也许更好。</p>
<p>而对于preg和ereg两个系列之间的执行效率，曾看到文章说preg要更快一点，具体由于使用ereg的时候并不多，而且也要推出历史舞台了，再加个个人更偏好于PCRE的方式，所以笔者就不做比较了，熟悉的朋友可以发表下意见，谢谢。 </p>
<img src ="http://www.blogjava.net/DreamFight/aggbug/339704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2010-12-03 11:25 <a href="http://www.blogjava.net/DreamFight/articles/339704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache改变虚拟目录</title><link>http://www.blogjava.net/DreamFight/articles/270580.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Thu, 14 May 2009 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/270580.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/270580.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/270580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/270580.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/270580.html</trackback:ping><description><![CDATA[<p>找到APACHE安装目录下的conf目录下的httpd.conf文件,将其中的: <br />
(用记事本打开,并查找DocumentRoot) <br />
将 <br />
DocumentRoot 后面的目录改为你所需的目录即可!</p>
<p>下面还有一处 <br />
&lt;Directory "c:/apache/apache2/htdocs"&gt; <br />
也要改 <br />
<br />
然后重新启动服务</p>
<img src ="http://www.blogjava.net/DreamFight/aggbug/270580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-05-14 13:02 <a href="http://www.blogjava.net/DreamFight/articles/270580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP和正则表达式 </title><link>http://www.blogjava.net/DreamFight/articles/266927.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Wed, 22 Apr 2009 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/266927.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/266927.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/266927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/266927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/266927.html</trackback:ping><description><![CDATA[PHP和正则表达式 <br />
一个正则表达式是一个特定的格式化模式，可以用来找出一个字符串在另一个字符串中的使用情况。几个编程语言，包括Visual Basic,Perl,JavaScript和PHP都支持正则表达式，希望在这篇入门指导的结束，Mitchell(作者自己)可以让你在PHP程序中能应用一些基本的正则表达式。正则表达式是在各种各样的程序语言中突出的古怪特征中的一种，但是由于它们看起来是很难的一个概念，所以很多开发者就把它们放到了角落里，忘记了它们的存在。 <br />
让我们先来看看什么是正则表达式，为什么你要在PHP程序中用到它们。 <br />
什么是正则表达式? <br />
你对从一个不错的老的基于控制的文本编辑器中分离出像BBEdit和notepad的程序，有什么看法呢？两个都支持文本输入，可以让你保存文本到文件中，但是现在的文本编辑器也支持其它功能，包括查找&#8211;代替工具，这让编辑一个文本文件相当容易。 <br />
正则表达式也是相似的，只是更好一些。正则表达式可以被认为一个极其高级的查找-替换工具，让我们从痛苦中摆脱出来：不必再写定制的数据确认例子来检查电子邮件地址或者来确认电话号码的格式是正确的，如此等等。 <br />
任何程序中最普通的函数之一就是数据有效性检查，PHP捆绑了一些文本检查函数，允许我们用正则表达式匹配一个字符串，确认有一个空格，有一个问号，等等。 <br />
你不知道的可能是，正则表达式可以简单装备吗，当你掌握了一些正则表达式时(这个正则表达式可以用来告诉正则表达式引擎一个字符串中我们想要匹配的部分)，你会自问为什么会把正则表达式扔到角落里这么久，^_^。 <br />
PHP有两套函数，用来处理两种类型的正则表达式:Perl5兼容模式，和Posix标准兼容模式。在这篇文章中我们将看看ereg函数，用遵照Posix标准的搜索表达式工作。虽然它们并没有Perl5模式那样强大，但是一种不错的学习正则表达式的方法。如果你对PHP支持的Perl5兼容正则表达式感兴趣，可以到PHP.net网站找一些关于preg函数的细节。 <br />
PHP有六个函数来处理正则表达式，它们都把一个正则表达式作为它们的第一个参数，列出如下： <br />
ereg: 最常用的正则表达式函数, ereg 允许我们搜索跟一个正则表达式匹配的一个字符串. <br />
ereg_replace: 允许我们搜索跟正则表达式匹配的一个字符串，并用新的字符串代替所有这个表达式出现的地方。 <br />
eregi: 和ereg几乎是一样效果，不过忽略大小写。 <br />
eregi_replace: 和ereg_replace有着一样的搜索-替换功能，不过忽略大小写. <br />
split: 允许我们搜索和正则表达式匹配的字符串，并且以字符串集合的方式返回匹配结果. <br />
spliti: split函数忽略大小写的版本. <br />
为什么使用正则表达式? <br />
如果你不断地建立不同的函数来检查或者操作字符串的一部分，现在你可能要放弃所有的这些函数，取而代之的用正则表达式。如果你对下列的问题都答&#8220;是的&#8221;，那么你肯定要考虑使用正则表达式了： <br />
你是否正在写一些定制的函数来检查表单数据（比如在电子信箱地址中的一个@，一个点）? <br />
你是否写一些定制的函数，在一个字符串中循环每个字符，如果这个字符匹配了一个特定特征（比如它是大写的，或者它是一个空格），那么就替换它? <br />
除了是令人不舒服的字符串检查和操作方法，如果没有有效率地写代码，上述的两条也会使你的程序慢下来。你是否更倾向于用下面的代码检查一个电子信箱地址呢: <br />
<?php <br />
function validateEmail($email) <br />
{ <br />
$hasAtSymbol = strpos($email, "@"); <br />
$hasDot = strpos($email, "."); <br />
if($hasAtSymbol &amp;&amp; $hasDot) <br />
return true; <br />
else <br />
return false; <br />
} <br />
echo validateEmail("mitchell@devarticles.com"); <br />
?&gt; <br />
... <br />
或者使用下面的代码: <br />
<?php <br />
function validateEmail($email) <br />
{ <br />
return ereg("^[a-zA-Z]+@[a-zA-Z]+.[a-zA-Z]+$", $email); <br />
} <br />
echo validateEmail("mitchell@devarticles.com"); <br />
?&gt; <br />
可以肯定的是，第一个函数比较容易，而且看起来结构也不错。但是如果我们用上面的下一个版本的email地址检查函数不是更容易吗？ <br />
上面展示的第二个函数只用了正则表达式，包括了对ereg函数的一个调用。Ereg 函数返回true或者false,来声明它的字符串参数是否和正则表达式相匹配。 <br />
很多编程者避开正则表达式，只因为它们（在一些情况下）比其它的文本处理方法更慢。正则表达式可能慢的原因是因为它们涉及把字符串在内存中拷贝和粘贴，因为正则表达式的每一个新的部分都对应匹配一个字符串。但是，从我对正则表达式的经验来说，除非你在文本中几百个行运行一个复杂的正则表达式，否则性能上的缺陷都可以忽略不计，当把正则表达式作为输入数据检查工具时，也很少出现这种情况。 <br />
正则表达式语法 <br />
在你可以匹配一个字符串到正则表达式之前，你必须先建立正则表达式。开始的时候，正则表达式的语法有点古怪，表达式中的每一个短语代表某个类型的搜索特征。下列是一些最普通的正则表达式，也都对应着一个如何使用它的例子: <br />
字符串头部 <br />
搜索一个字符串的头部，用^,例如 <br />
<?php echo ereg("^hello", "hello world!"); ?><br />
将返回 true, 但是 <br />
<?php echo ereg("^hello", "i say hello world"); ?><br />
将返回 false, 因为hello不在字符串&#8221;I say hello world&#8221;的头部。 <br />
字符串尾部 <br />
搜索字符串尾部，用$,例如： <br />
<?php echo ereg("bye$", "goodbye"); ?><br />
将返回true, 但是 <br />
<?php echo ereg("bye$", "goodbye my friend"); ?><br />
将返回 false,因为bye不在字符串&#8221;goodbye my friend&#8221;的尾部. <br />
任意的单个字符 <br />
搜索任意字符，用点(.),例如： <br />
<?php echo ereg(".", "cat"); ?><br />
将返回true,但是 <br />
<?php echo ereg(".", ""); ?><br />
将返回false,因为我们的要搜索字符串没有包含字符。你可以用花括号随意告诉正则表达式引擎它要匹配多少个单个字符。如果我只想匹配5个字符，我可以这样用ereg: <br />
<?php echo ereg(".{5}$", "12345"); ?><br />
上面的这段代码告诉正则表达式引擎当且仅当至少5个连续的字符出现字符串的尾部时返回true.我们也可以限制连续出现的字符的数目： <br />
<?php echo ereg("a{1,3}$", "aaa"); ?><br />
在上面的例子里，我们已经告诉正则表达式引擎，我们的搜索字符串来匹配表达式，它在尾部必须有介于1和3个的&#8221;a&#8221;字符。 <br />
<?php echo ereg("a{1,3}$", "aaab"); ?><br />
上面的例子将不会返回true，虽然有三个&#8221;a&#8221;字符在搜索字符串里，但是它们不是在字符串的尾部。如果我们把结尾字符串匹配$从正则表达式中去掉，那么这个字符串是匹配的。 <br />
我们也可以告诉正则表达式引擎来匹配至少有确定数目的字符在一行，如果它们存在的，可以匹配更多。 我们可以这样做： <br />
<?php echo ereg("a{3,}$", "aaaa"); ?><br />
零或多次重复字符 <br />
为了告诉正则表达式引擎一个字符可能存在，也可以重复，我们用*字符。这里的两个例子都将返回true. <br />
<?php echo ereg("t*", "tom"); ?><br />
<?php echo ereg("t*", "fom"); ?><br />
即使第二个例子不包含&#8221;t&#8221;这个字符，但仍旧返回ture,因为*表示字符可以出现，但不是必须出现。事实上，任何普通的字符串模式都会使上面的ereg调用返回true，因为't'字符是可选的. <br />
一或多次重复字符 <br />
为了告诉正则表达式引擎一个字符必须存在，也可以重复不止一次，我们用+字符，像 <br />
<?php echo ereg("z+", "i like the zoo"); ?><br />
下面的例子也会返回true: <br />
<?php echo ereg("z+", "i like the zzzzzzoo!"); ?><br />
零或一次重复字符 <br />
我们也可以告诉正则表达式引擎，一个字符必须是或者只存在一次，或者没有。我们用?字符来做这项工作，就像 <br />
<?php echo ereg("c?", "cats are fuzzy"); ?><br />
如果我们愿意，我们完全可以从上面的搜索字符串中删除'c'，这个表达式会仍旧返回true.'?' 的意思是一个'c'可以出现在搜索字符串的任何地方，但不是必须的。 <br />
正则表达式语法 (续) <br />
空格字符 <br />
为了匹配一个搜索字符串中的空格字符，我们用预定义Posix的类，[[:space]].方括号标明连续字符的相关性，&#8221;:space:&#8221;是实际要匹配的类（在这种情形下，是任何空白字符）。空白包括tab字符，新行字符，空白字符。或者，如果搜索字符串必须包含只有一个空格，而不是一个tab或者新行字符，你可以用一个空格字符(" ")。在大多数情况下，我倾向于使用":space:"，因为这意味着我的意图不仅仅是单个空格字符，这点很容易被忽视。这里有一些Posix-标准预定义类， <br />
有一些我们可以作为正则表达式的部分的一些Posix-标准预定义类，包括[:alnum:], [:digit:], [:lower:]等等。 完整的列表可以在这里查看 <br />
我们可以像这样匹配单个空白字符： <br />
<?php echo ereg("Mitchell[[:space:]]Harper", "Mitchell Harper"); ?><br />
我们也可以通过在表达式后用?字符来告诉正则表达式引擎匹配没有空白或者一个空白。 <br />
<?php echo ereg("Mitchell[[:space:]]?Harper", "MitchellHarper"); ?><br />
模式分组 <br />
相关的模式可以在方括号里分在一起。很容易用[a-z]和[A-Z]指定只有一个小写字母或者一列大写字母以搜索字符串的一部分存在。 <br />
<?php <br />
// 要求从第一个到最后一个都是小写字母 <br />
echo ereg("^[a-z]+$", "johndoe"); // 返回true <br />
?&gt; <br />
或者像 <br />
<?php <br />
// 要求从第一个到最后一个都是大写字母 <br />
ereg("^[A-Z]+$", "JOHNDOE"); // 返回 true? <br />
?&gt; <br />
我们也可以告诉正则表达式引擎，我们希望或者是小写字母，或者是大写字母。我们只要把[a-z]和[A-Z]模式结合在一起就可以做到。 <br />
<?php echo ereg("^[a-zA-Z]+$", "JohnDoe"); ?><br />
在上面的例子里，如果我们能匹配"John Doe",而不是"JohnDoe"，将是非常有意义的。我们用下面的正则表达式来做这个： <br />
^[a-zA-Z]+[[:space:]]{1}[a-zA-Z]+$ <br />
很容易搜索一个数字字符串 <br />
<?php echo ereg("^[0-9]+$", "12345"); ?><br />
词语分组 <br />
不仅仅搜索模式可以分组，我们也可以用圆括号把相关的搜索词语进行分组。 <br />
<?php echo ereg("^(John|Jane).+$", "John Doe"); ?><br />
在上面的例子中，我们有一个字符串头部字符，紧跟着"John"或者"Jane",至少有一个其它字符，然后一个字符串尾部字符。所以&#8230; <br />
<?php echo ereg("^(John|Jane).+$", "Jane Doe"); ?><br />
...将也匹配我们的搜索模式 <br />
特殊字符的情形 <br />
因为一些字符要用在一个搜索模式的明确分组或者语法上，像在(John|Jane)中的圆括号，我们需要告诉正则表达式引擎来屏蔽这些字符，加工它们使之成为被搜索字符串的一部分，而不是搜索表达式的一部分。我们所用的方法称为&#8220;字符转义&#8221;，涉及到将任何&#8220;专用符号&#8221;加上反斜杠。所以，例如，如果我想在我的搜索中包含'|'，那么我就可以这样做 <br />
<?php echo ereg("^[a-zA-z]+|[a-zA-z]+$", "John|Jane"); ?><br />
这里只是少量的一些你要转义的字符，你必须转义^, $, (, ), ., [, |, *, ?, +, and { 。 <br />
希望你现在对正则表达式实际上有多么强大有了一点点感觉了。现在让我们看两个用正则表达式来检查数据中一个字符串的例子。 <br />
正则表达式例子 <br />
例子1 <br />
让我们把第一个例子做的相当简单，检验一个标准的URL.一个标准的URL(没有端口号),有三个部分构成： <br />
[协议]://[域名] <br />
让我们从匹配URL的协议部分开始,并且让它只能用http或者ftp.我们可以用下面的正则表达式做到这点： <br />
^(http|ftp) <br />
^字符特指字符串的头部，利用圆括号把http和ftp围住，且用&#8220;或者&#8221;符号(|)将它们分开，我们告诉正则表达式引擎http和ftp两者之一必须在字符串的开头。 <br />
一个域名通常由www.somesite.com构成，但是可以随意选择要不要www部分。为了例子简单，我们只允许.com,.net,和.org的域名是在考虑之中的。我们最好这样对正则表达式中的域名部分表示如下： <br />
(www.)?.+.(com|net|org)$ <br />
把所有的东西放在一起，我们的正则表达式就可以用作检查一个域名，如： <br />
<?php <br />
function isValidDomain($domainName) <br />
{ <br />
return ereg("^(http|ftp)://(www.)?.+.(com|net|org)$", $domainName); <br />
} <br />
//真(true) <br />
echo isValidDomain("http://www.somesite.com"); <br />
//真(true) <br />
echo isValidDomain("ftp://somesite.com"); <br />
//假 (false) <br />
echo isValidDomain("ftp://www.somesite.fr"); <br />
//假 (false) <br />
echo isValidDomain("www.somesite.com"); <br />
?&gt; <br />
例子二 <br />
因为我居住在澳大利亚悉尼，让我们检查一个典型的澳大利亚国际电话号码。澳大利亚国际电话号码的格式如下： <br />
+61x xxxx-xxxx <br />
第一个x是区号，其它的都是电话号码。检查以'+61'开头且紧跟一个在2到9之间的区号的电话号码，我们用下面的正则表达式： <br />
^+61[2-9][[:space:]] <br />
注意，上面的搜索模式把'+'字符用''转义，以便于可以在搜索中包含，不至于被解释为一个正则表达式。[2-9]告诉正则表达式引擎我们需要包含一个2到9之间的数字。[[:space:]]类则告诉正则表达式期望在这里有一个空白。 <br />
这里是电话号码剩下的搜索模式： <br />
[0-9]{4}-[0-9]{4}$ <br />
这里没有什么不寻常的地方，我们只是告诉正则表达式引擎电话号码可用的数字，它必须是4个数字的组合，跟着一个连接符，再跟着另一个4个数字的组合，然后一个字符串尾部字符。 <br />
把完整的正则表达式放在一起，放进一个函数，我们可以用代码来检查一些澳大利亚国际电话号码： <br />
<?php <br />
function isValidPhone($phoneNum) <br />
{ <br />
echo ereg("^+61[2-9][[:space:]][0-9]{4}-[0-9]{4}$", $phoneNum); <br />
} <br />
// 真（true） <br />
echo isValidPhone("+619 0000-0000"); <br />
// 假（false） <br />
echo isValidPhone("+61 00000000"); <br />
//假（ false） <br />
echo isValidPhone("+611 00000000"); <br />
?&gt; <br />
总结 <br />
正则表达式用一些不适合书写和重复的代码来检查一个字符串。在最后的几页里，我们已经讲解了所有的Posix标准正则表达式的基础，包括字符，分组和PHP ereg函数。我们也知道了怎么用正则表达式来检查一些PHP中简单的字符串。 <br />
译者注释：本人英文不怎么好，可能一些地方有出入。本文中的字符类其实是我们所说的字符簇 <br />
经典正则表达式 <br />
正则表达式用于字符串处理，表单验证等场合，实用高效，但用到时总是不太把握，以致往往要上网查一番。我将一些常用的表达式收藏在这里，作备忘之用。本贴随时会更新。 <br />
匹配中文字符的正则表达式： [u4e00-u9fa5] <br />
匹配双字节字符(包括汉字在内)：[^x00-xff] <br />
应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1） <br />
String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;} <br />
匹配空行的正则表达式：n[s| ]*r <br />
匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*</1>|&lt;(.*) /&gt;/ <br />
匹配首尾空格的正则表达式：(^s*)|(s*$) <br />
应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下： <br />
String.prototype.trim = function() <br />
{ <br />
return this.replace(/(^s*)|(s*$)/g, ""); <br />
} <br />
利用正则表达式分解和转换IP地址： <br />
下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序： <br />
function IP2V(ip) <br />
{ <br />
re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式 <br />
if(re.test(ip)) <br />
{ <br />
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 <br />
} <br />
else <br />
{ <br />
throw new Error("Not a valid IP address!") <br />
} <br />
} <br />
不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下： <br />
var ip="10.100.20.168" <br />
ip=ip.split(".") <br />
alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1)) <br />
匹配Email地址的正则表达式：w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* <br />
匹配网址URL的正则表达式：http://([w-]+.)+[w-]+(/[w- ./?%&amp;=]*)? <br />
利用正则表达式去除字串中重复的字符的算法程序： <br />
var s="abacabefgeeii" <br />
var s1=s.replace(/(.).*1/g,"$1") <br />
var re=new RegExp("["+s1+"]","g") <br />
var s2=s.replace(re,"") <br />
alert(s1+s2) //结果为：abcefgi <br />
我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法，最终没有找到，这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。 <br />
得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1 <br />
s="http://www.9499.net/page1.htm" <br />
s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") <br />
alert(s) <br />
利用正则表达式限制网页表单里的文本框输入内容： <br />
用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))" <br />
用正则表达式限制只能输入全角字符： onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))" <br />
用正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" <br />
用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))" <br />
如何用正则表达式来表示中文 <br />
由于中文的ASCII码是有一定的范围的。所以你可以用下面的正则表达式来表示中文。 <br />
/^[chr(0xa1)-chr(0xff)]+$/ <br />
下面是一个使用的例子： <br />
$str = "超越PHP"; <br />
if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $str)) { <br />
echo "这是一个纯中文字符串"; <br />
} else { <br />
echo "这不是一个纯中文字串"; <br />
} <br />
正则表达式 <br />
如果原来没有使用过正则表达式，那么可能对这个术语和概念会不太熟悉。不过，它们并不是您想象的那么新奇。 <br />
请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符，而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件： <br />
data1.dat <br />
data2.dat <br />
datax.dat <br />
dataN.dat <br />
如果使用 * 字符代替 ? 字符，则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名： <br />
data.dat <br />
data1.dat <br />
data2.dat <br />
data12.dat <br />
datax.dat <br />
dataXYZ.dat <br />
尽管这种搜索文件的方法肯定很有用，但也十分有限。? 和 * 通配符的有限能力可以使你对正则表达式能做什么有一个概念，不过正则表达式的功能更强大，也更灵活。 <br />
-------------------------------------------------------------------------------- <br />
2 <br />
早期起源 <br />
正则表达式的&#8220;祖先&#8221;可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。 <br />
1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上，发表了一篇标题为&#8220;神经网事件的表示法&#8221;的论文，引入了正则表达式的概念。正则表达式就是用来描述他称为&#8220;正则集的代数&#8221;的表达式，因此采用&#8220;正则表达式&#8221;这个术语。 <br />
随后，发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究，Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。 <br />
如他们所说，剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。 <br />
-------------------------------------------------------------------------------- <br />
3. <br />
使用正则表达式 <br />
在典型的搜索和替换操作中，必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了，但是由于它缺乏灵活性，因此在搜索动态文本时就有困难了，甚至是不可能的。 <br />
使用正则表达式，就可以： <br />
测试字符串的某个模式。例如，可以对一个输入字符串进行测试，看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。 <br />
替换文本。可以在文档中使用一个正则表达式来标识特定文字，然后可以全部将其删除，或者替换为别的文字。 <br />
根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。 <br />
例如，如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记，则可以使用正则表达式对每个文件进行测试，看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法，就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料，最后，可以再次使用正则表达式来查找并替换那些需要替换的标记。 <br />
另一个说明正则表达式非常有用的示例是一种其字符串处理能力还不为人所知的语言。VBScript 是 Visual Basic 的一个子集，具有丰富的字符串处理功能。与 C 类似的 Visual Basic Scripting Edition 则没有这一能力。正则表达式给 Visual Basic Scripting Edition 的字符串处理能力带来了明显改善。不过，可能还是在 VBScript 中使用正则表达式的效率更高，它允许在单个表达式中执行多个字符串操作。 <br />
-------------------------------------------------------------------------------- <br />
正则表达式语法 <br />
一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。 <br />
这里有一些可能会遇到的正则表达式示例： <br />
Visual Basic Scripting Edition VBScript 匹配 <br />
/^[ t]*$/ "^[ t]*$" 匹配一个空白行。 <br />
/d{2}-d{5}/ "d{2}-d{5}" 验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。 <br />
/&lt;(.*)&gt;.*</1>/ "&lt;(.*)&gt;.*</1>" 匹配一个 HTML 标记。 <br />
下表是元字符及其在正则表达式上下文中的行为的一个完整列表： <br />
字符 描述 <br />
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'n' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。 <br />
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 'n' 或 'r' 之后的位置。 <br />
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 'n' 或 'r' 之前的位置。 <br />
* 匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。 <br />
+ 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。 <br />
? 匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 <br />
{n} n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。 <br />
{n,} n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 <br />
{n,m} m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。刘， "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 <br />
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。 <br />
. 匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符，请使用象 '[.n]' 的模式。 <br />
(pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在Visual Basic Scripting Edition 中则使用 $0&#8230;$9 属性。要匹配圆括号字符，请使用 '(' 或 ')'。 <br />
(?:pattern) 匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 <br />
(?=pattern) 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如， 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。 <br />
(?!pattern) 负向预查，在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始 <br />
x|y 匹配 x 或 y。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 <br />
[xyz] 字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。 <br />
[^xyz] 负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。 <br />
[a-z] 字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 <br />
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 <br />
b 匹配一个单词边界，也就是指单词和空格间的位置。例如， 'erb' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。 <br />
B 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。 <br />
cx 匹配由x指明的控制字符。例如， cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。 <br />
d 匹配一个数字字符。等价于 [0-9]。 <br />
D 匹配一个非数字字符。等价于 [^0-9]。 <br />
f 匹配一个换页符。等价于 x0c 和 cL。 <br />
n 匹配一个换行符。等价于 x0a 和 cJ。 <br />
r 匹配一个回车符。等价于 x0d 和 cM。 <br />
s 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ fnrtv]。 <br />
S 匹配任何非空白字符。等价于 [^ fnrtv]。 <br />
t 匹配一个制表符。等价于 x09 和 cI。 <br />
v 匹配一个垂直制表符。等价于 x0b 和 cK。 <br />
w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 <br />
W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 <br />
xn 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， 'x41' 匹配 "A"。'x041' 则等价于 'x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。. <br />
num 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)1' 匹配两个连续的相同字符。 <br />
n 标识一个八进制转义值或一个后向引用。如果 n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。 <br />
nm 标识一个八进制转义值或一个后向引用。如果 nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm 为后向引用。如果 nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 nm 将匹配八进制转义值 nm。 <br />
nml 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。 <br />
un 匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， u00A9 匹配版权符号 (?)。 <br />
4. <br />
建立正则表达式 <br />
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。 <br />
可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式。对 Visual Basic Scripting Edition 而言，分隔符为一对正斜杠 (/) 字符。例如： <br />
/expression/ <br />
对 VBScript 而言，则采用一对引号 ("") 来确定正则表达式的边界。例如： <br />
"expression" <br />
在上面所示的两个示例中，正则表达式模式 (expression) 均存储在RegExp 对象的Pattern 属性中。 <br />
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。 <br />
-------------------------------------------------------------------------------- <br />
5. <br />
优先权顺序 <br />
在构造正则表达式之后，就可以象数学表达式一样来求值，也就是说，可以从左至右并按照一个优先权顺序来求值。 <br />
下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序： <br />
操作符 描述 <br />
转义符 <br />
(), (?, (?=), [] 圆括号和方括号 <br />
*, +, ?, {n}, {n,}, {n,m} 限定符 <br />
^, $, anymetacharacter 位置和顺序 <br />
| &#8220;或&#8221;操作 <br />
-------------------------------------------------------------------------------- <br />
6. <br />
普通字符 <br />
普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。 <br />
最简单的正则表达式是一个单独的普通字符，可以匹配所搜索字符串中的该字符本身。例如，单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有一些单字符正则表达式模式的示例： <br />
/a/ <br />
/7/ <br />
/M/ <br />
等价的 VBScript 单字符正则表达式为： <br />
"a" <br />
"7" <br />
"M" <br />
可以将多个单字符组合在一起得到一个较大的表达式。例如，下面的 Visual Basic Scripting Edition 正则表达式不是别的，就是通过组合单字符表达式 'a'、'7'以及 'M' 所创建出来的一个表达式。 <br />
/a7M/ <br />
等价的 VBScript 表达式为： <br />
"a7M" <br />
请注意这里没有连接操作符。所需要做的就是将一个字符放在了另一个字符后面。 <br />
-------------------------------------------------------------------------------- <br />
特殊字符 <br />
有不少元字符在试图对其进行匹配时需要进行特殊的处理。要匹配这些特殊字符，必须首先将这些字符转义，也就是在前面使用一个反斜杠 ()。下表给出了这些特殊字符及其含义： <br />
特殊字符 说明 <br />
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹配 'n' 或 'r'。要匹配 $ 字符本身，请使用 $。 <br />
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 ( 和 )。 <br />
* 匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 *。 <br />
+ 匹配前面的子表达式一次或多次。要匹配 + 字符，请使用 +。 <br />
. 匹配除换行符 n之外的任何单字符。要匹配 .，请使用 。 <br />
[ 标记一个中括号表达式的开始。要匹配 [，请使用 [。 <br />
? 匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 ?。 <br />
将下一个字符标记为或特殊字符、或原义字符、或后向引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'n' 匹配换行符。序列 '' 匹配 ""，而 '(' 则匹配 "("。 <br />
^ 匹配输入字符串的开始位置，除非在方括号表达式中使用，此时它表示不接受该字符集合。要匹配 ^ 字符本身，请使用 ^。 <br />
{ 标记限定符表达式的开始。要匹配 {，请使用 {。 <br />
| 指明两项之间的一个选择。要匹配 |，请使用 |。<br />
本文来自: 脚本之家(www.jb51.net) 详细出处参考：http://www.jb51.net/article/8627.htm
<img src ="http://www.blogjava.net/DreamFight/aggbug/266927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-04-22 11:13 <a href="http://www.blogjava.net/DreamFight/articles/266927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP语言中global和$GLOBALS[]的分析</title><link>http://www.blogjava.net/DreamFight/articles/266422.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Sun, 19 Apr 2009 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/266422.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/266422.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/266422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/266422.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/266422.html</trackback:ping><description><![CDATA[原来以为global和$GLOBALS除了写法不一样以为,其他都一样,可是在实际应用中发现,2者的区别还是很大的!<br />
先看下面的例子:
<div class="blockcode">
<div id="code0">
<ol>
    <li>&lt;?php<br />
    <li>// 例子1<br />
    <li>function test_global() {<br />
    <li>&nbsp;<wbr>&nbsp;<wbr>global $var1, $var2;<br />
    <li>&nbsp;<wbr>&nbsp;<wbr>$var2 =&amp; $var1;<br />
    <li>}<br />
    <li><br />
    <li>function test_globals() {<br />
    <li>&nbsp;<wbr>&nbsp;<wbr>$GLOBALS['var3'] =&amp; $GLOBALS['var1'];<br />
    <li>}<br />
    <li><br />
    <li>$var1 = 5;<br />
    <li>$var2 = $var3 = 0;<br />
    <li><br />
    <li>test_global();<br />
    <li>print $var2 ."\n";<br />
    <li><br />
    <li>test_globals();<br />
    <li>print $var3 ."\n";<br />
    <li>?&gt; </li>
</ol>
</div>
<em>复制代码</em></div>
执行结果为:
<div class="quote">
<blockquote>0<br />
5</blockquote></div>
怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢?<br />
<br />
恩,我们保留以上问题,深入分析$GLOBALS和global的原理!<br />
<div class="quote">
<blockquote>引用php手册的$GLOBALS的解释:<br />
<br />
Global 变量：$GLOBALS<br />
注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。<br />
<br />
由所有已定义全局变量组成的数组。变量名就是该数组的索引。<br />
<br />
这是一个&#8220;superglobal&#8221;，或者可以描述为自动全局变量。</blockquote></div>
也就是说上面代码中的<font color="#ff0000">$var1</font>和<font color="#ff0000">$GLOBALS['var1']</font>是指的同一变量，而不是2个不同的变量！<br />
<br />
下面来分析global到底做了什么？<br />
<br />
我们都知道php中的函数所产生的变量都是函数的私有变量，那么global关键字产生的变量也肯定逃不出这个规则，为什么这么说呢，看下面的代码：
<div class="blockcode">
<div id="code1">
<ol>
    <li>&lt;?php<br />
    <li>// 例子2<br />
    <li>function test() {<br />
    <li>&nbsp;<wbr>&nbsp;<wbr>global $a;<br />
    <li>&nbsp;<wbr>&nbsp;<wbr>unset($a);<br />
    <li>}<br />
    <li>$a = 1;<br />
    <li>test();<br />
    <li>print $a;<br />
    <li>?&gt; </li>
</ol>
</div>
<em>复制代码</em></div>
执行结果为：
<div class="quote">
<blockquote>1</blockquote></div>
为什么会输出1呢？不是已经把$a给unset了吗？unset失灵了？php的bug？<br />
<br />
都不是，其实unset起作用了，是把test函数中的$a给unset掉了，可以在函数后面加入
<div class="blockcode">
<div id="code2">
<ol>
    <li>print $a; </li>
</ol>
</div>
</div>
<br />
所以我们得出一个结论，在函数中global和$GLOBALS[]的区别在于：<br />
<br />
global在函数产生一个指向函数外部变量的别名变量，而不是真正的函数外部变量，一但改变了别名变量的指向地址，就会发生一些意料不到情况，例如例子1.<br />
<br />
$GLOBALS[]确确实实调用是外部的变量，函数内外会始终保持一致！<br />
<img src ="http://www.blogjava.net/DreamFight/aggbug/266422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-04-19 14:52 <a href="http://www.blogjava.net/DreamFight/articles/266422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP 中cookie和session的分析</title><link>http://www.blogjava.net/DreamFight/articles/262804.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Mon, 30 Mar 2009 00:47:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/262804.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/262804.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/262804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/262804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/262804.html</trackback:ping><description><![CDATA[1. PHP的COOKIE <br />
cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。 <br />
PHP在http协议的头信息里发送cookie，因此 setcookie() 函数必须在其它信息被输出到浏览器前调用，这和对 header() 函数的限制类似。 <br />
<br />
1.1设置cookie: <br />
可以用setcookie()或setrawcookie()函数来设置cookie。也可以通过向客户端直接发送http头来设置。 <br />
<br />
1.1.1 使用setcookie()函数设置cookie: <br />
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] ) name: cookie变量名 value: cookie变量的值 expire: 有效期结束的时间 path: 有效目录 domain: 有效域名，顶级域唯一 secure: 如果值为1，则cookie只能在https连接上有效，如果为默认值0，则http和https都可以。 例子： <br />
代码片段 <br />
&lt;?php <br />
$value = 'something from somewhere'; <br />
setcookie("TestCookie", $value); /* 简单cookie设置 */ <br />
setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时 */ <br />
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名*/ <br />
?&gt; <br />
设置多个cookie变量：setcookie('var[a]','value'); 用数组来表示变量，但他的下标不用引号。这样就可以用$_COOKIE[&#8216;var&#8217;][&#8216;a&#8217;]来读取该COOKIE变量。 <br />
<br />
1.1.2. 使用header()设置cookie; <br />
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]"); <br />
后面的参数和上面列出setcookie函数的参数一样。 <br />
比如： <br />
$value = 'something from somewhere'; <br />
header("Set-Cookie:name=$value"); <br />
<br />
1.2 Cookie的读取: <br />
直接用php内置超级全局变量$_COOKIE就可以读取浏览器端的cookie。 上面例子中设置了cookie"TestCookie"，现在我们来读取： <br />
代码片段 <br />
print $_COOKIE['TestCookie']; <br />
COOKIE是不是被输出了?! <br />
<br />
1.3 删除cookie <br />
只需把有效时间设为小于当前时间，和把值设置为空。例如： <br />
代码片段 <br />
setcookie("name", "", time()-1); <br />
用header()类似。 <br />
<br />
1.4 常见问题解决: <br />
1) 用setcookie()时有错误提示，可能是因为调用setcookie()前面有输出或空格。也可能你的文档是从其他字符集转换过来，文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符)。解决的办法就是使你的文档不出现这种情况。还有通过使用ob_start()函数也能处理一点。 <br />
2) $_COOKIE受magic_quotes_gpc影响，可能自动转义。 <br />
3) 使用的时候，有必要测试用户是否支持cookie。 <br />
<br />
1.5 cookie工作机理: <br />
有些学习者比较冲动，没心思把原理研究，所以我把它放后面。 <br />
a) 服务器通过随着响应发送一个http的Set-Cookie头，在客户机中设置一个cookie(多个cookie要多个头)。 <br />
b) 客户端自动向服务器端发送一个http的cookie头，服务器接收读取。 <br />
HTTP/1.x 200 OK X-Powered-By: PHP/5.2.1 <br />
Set-Cookie: TestCookie=something from somewhere; path=/ <br />
Expires: Thu, 19 Nov 2007 18:52:00 GMT <br />
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 <br />
Pragma: no-cache <br />
Content-type: text/html <br />
这一行实现了cookie功能，收到这行后 <br />
Set-Cookie: TestCookie=something from somewhere; path=/ <br />
浏览器将在客户端的磁盘上创建一个cookie文件，并在里面写入： <br />
TestCookie=something from somewhere; / <br />
这一行就是我们用setcookie('TestCookie','something from somewhere','/');的结果。也就是用 header('Set-Cookie: TestCookie=something from somewhere; path=/');的结果。 <br />
<br />
2. PHP的SESSION <br />
session使用过期时间设为0的cookie，并且将一个称为session ID的唯一标识符(一长串字符串)，在服务器端同步生成一些session文件(可以自己定义session的保存类型)，与用户机关联起来。web应用程序存贮与这些session相关的数据，并且让数据随着用户在页面之间传递。 <br />
访问网站的来客会被分配一个唯一的标识符，即所谓的SESSION ID。它要么存放在客户端的cookie，要么经由 URL 传递。 <br />
SESSION允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时，PHP 会自动（如果 session.auto_start 被设为 1）或在用户请求时（由 session_start() 明确调用或 session_register() 暗中调用）检查请求中是否发送了特定的SESSION ID。如果是，则之前保存的环境就被重建。 <br />
<br />
2.1 SESSION ID的传送 <br />
<br />
2.1.1 通过cookie传送SESSION ID <br />
使用session_start()调用session，服务器端在生成session文件的同时，生成session ID哈希值和默认值为PHPSESSID的session name，并向客户端发送变量为(默认的是)PHPSESSID(session name)，值为一个128位的哈希值。服务器端将通过该cookie与客户端进行交互。 <br />
session变量的值经php内部序列化后保存在服务器机器上的文本文件中，和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互。 <br />
即服务器自动发送了http头：header('Set-Cookie: session_name()=session_id(); path=/');即setcookie(session_name(),session_id()); <br />
当从该页跳转到的新页面并调用session_start()后，PHP将检查与给定ID相关联的服务器端存贮的session数据，如果没找到，则新建一个数据集。 <br />
<br />
2.1.2 通过URL传送session ID <br />
只有在用户禁止使用cookie的时候才用这种方法，因为浏览器cookie已经通用，为安全起见，可不用该方法。 <br />
&lt;a href="p.php?&lt;?php print session_name() ?&gt;=&lt;?php print session_id() ?&gt;"&gt;xxx&lt;/a&gt;，也可以通过POST来传递session值。 <br />
<br />
2.2 session基本用法实例 <br />
代码片段 <br />
&lt;?php <br />
// page1.php <br />
session_start(); <br />
echo 'Welcome to page #1'; /* 创建session变量并给session变量赋值 */ <br />
$_SESSION['favcolor'] = 'green'; <br />
$_SESSION['animal'] = 'cat'; <br />
$_SESSION['time'] = time(); // 如果客户端使用cookie,可直接传递session到page2.php <br />
echo '&lt;br /&gt;&lt;a href="page2.php"&gt;page 2&lt;/a&gt;'; // 如果客户端禁用cookie echo ' <br />
&lt;br /&gt;&lt;a href="page2.php?' . SID . '"&gt;page 2&lt;/a&gt;'; /* 默认php5.2.1下,SID只有在cookie被写入的同时才会有值,如果该session 对应的cookie已经存在,那么SID将为(未定义)空 */ <br />
?&gt; <br />
代码片段 <br />
&lt;?php <br />
// page2.php <br />
session_start(); <br />
print $_SESSION['animal']; // 打印出单个session <br />
var_dump($_SESSION); // 打印出page1.php传过来的session值 <br />
?&gt; <br />
<br />
2.3 使用session函数控制页面缓存 <br />
很多情况下，我们要确定我们的网页是否在客户端缓存，或要设置缓存的有效时间，比如我们的网页上有些敏感内容并且要登录才能查看，如果缓存到本地了，可以直接打开本地的缓存就可以不登录而浏览到网页了。 <br />
使用session_cache_limiter('private');可以控制页面客户端缓存，必须在session_start()之前调用。 <br />
更多参数见<a href="http://blog.chinaunix.net/u/27731/showart.php?id=258087" target="_blank">http://blog.chinaunix.net/u/27731/showart.php?id=258087</a>的客户端缓存控制。 <br />
控制客户端缓存时间用session_cache_expire(int); 单位(s)。也要在session_start()前调用。 <br />
这只是使用session的情况下控制缓存的方法，我们还可以在header()中控制控制页面的缓存。 <br />
<br />
2.4 删除session <br />
要三步实现。 <br />
代码片段 <br />
&lt;?php <br />
session_destroy(); // 第一步: 删除服务器端session文件,这使用 <br />
setcookie(session_name(),'',time()-3600); // 第二步: 删除实际的session: <br />
$_SESSION = array(); // 第三步: 删除$_SESSION全局变量数组 <br />
?&gt; <br />
<br />
2.5 session在PHP大型web应用中的使用 <br />
对于访问量大的站点，用默认的session存贮方式并不适合，目前最优的方法是用数据库存取session。这时，函数bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )就是提供给我们解决这个问题的方案。 <br />
该函数使用的6个函数如下： <br />
1. bool open() 用来打开会话存储机制。 <br />
2. bool close() 关闭会话存储操作。 <br />
3. mixde read() 从存储中装载session数据时使用这个函数。 <br />
4. bool write() 将给定session ID的所有数据写到存储中。 <br />
5. bool destroy() 破坏与指定的session ID相关联的数据。 <br />
6. bool gc() 对存储系统中的数据进行垃圾收集。 <br />
例子见php手册session_set_save_handler() 函数。 <br />
如果用类来处理，用 <br />
代码片段 <br />
session_set_save_handler( <br />
array('className','open'), <br />
array('className','close'), <br />
array('className','read'), <br />
array('className','write'), <br />
array('className','destroy'), <br />
array('className','gc'), <br />
) <br />
调用className类中的6个静态方法。className可以实例化对象就不用调用静态方法，但是用静态成员不用生成对象，性能更好。 <br />
<br />
2.6 常用session函数: <br />
bool session_start(void) 初始化session。 <br />
bool session_destroy(void) 删除服务器端session关联文件。 <br />
string session_id() 当前session的id。 <br />
string session_name() 当前存取的session名称，也就是客户端保存session ID的cookie名称.默认PHPSESSID。 <br />
array session_get_cookie_params() 与这个session相关联的session的细节。 <br />
string session_cache_limiter() 控制使用session的页面的客户端缓存。 <br />
ini session_cache_expire() 控制客户端缓存时间。 <br />
bool session_destroy() 删除服务器端保存session信息的文件。 <br />
void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] ) 设置与这个session相关联的session的细节。 <br />
bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc ) 定义处理session的函数(不是使用默认的方式)。 <br />
bool session_regenerate_id([bool delete_old_session]) 分配新的session id <br />
<br />
2.7 session安全问题 <br />
攻击者通过投入很大的精力尝试获得现有用户的有效session ID，有了session id，他们就有可能 <br />
能够在系统中拥有与此用户相同的能力。 <br />
因此，我们主要解决的思路是效验session ID的有效性。 <br />
代码片段 <br />
&lt;?php <br />
if(!isset($_SESSION['user_agent'])){ <br />
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']; <br />
} /* 如果用户session ID是伪造 */ <br />
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) { session_regenerate_id(); <br />
} <br />
?&gt; <br />
<br />
2.8 Session通过cookie传递和通过SID传递的不同 <br />
在php5.2.1的session的默认配置的情况下，当生成session的同时，服务器端将在发送header set-cookie同时生成预定义超级全局变量SID(也就是说，写入cookie和抛出SID是等价的)，当$_COOKIE['PHPSESSID']存在以后，将不再写入cookie，也不再生成超级全局变量SID，此时，SID将是空的。 <br />
<br />
2.9 session使用实例 <br />
代码片段 <br />
&lt;?php <br />
/** * 效验session的合法性 * */ <br />
function sessionVerify() { <br />
if(!isset($_SESSION['user_agent'])){ <br />
$_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR'] .$_SERVER['HTTP_USER_AGENT']); <br />
} /* 如果用户session ID是伪造,则重新分配session ID */ <br />
elseif ($_SESSION['user_agent']!=MD5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'])) { <br />
session_regenerate_id(); <br />
} <br />
} <br />
/** * 销毁session * 三步完美实现,不可漏 * */ <br />
function sessionDestroy() { <br />
session_destroy(); <br />
setcookie(session_name(),'',time()-3600); <br />
$_SESSION = array(); <br />
} <br />
?&gt; <br />
注明： <br />
session 出现头信息已经发出的原因与cookie一样。 在php5中，所有php session的注册表配置选项都是编程时可配置的，一般情况下，我们是不用修改其配置的。要了解php的session注册表配置选项，请参考手册的Session会话处理函数处。 <br />
<img src ="http://www.blogjava.net/DreamFight/aggbug/262804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-03-30 08:47 <a href="http://www.blogjava.net/DreamFight/articles/262804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP中$_SERVER的详细用法</title><link>http://www.blogjava.net/DreamFight/articles/262799.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Sun, 29 Mar 2009 23:11:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/262799.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/262799.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/262799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/262799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/262799.html</trackback:ping><description><![CDATA[<div style="color: #000000" id="articleBody" class="articleContent"><span style="color: rgb(255,0,0)"><span style="color: #000000">$_SERVER['PHP_SELF'] #当前正在执行脚本的文件名，与 document root相关。<br />
</span></span>$_SERVER['argv'] #传递给该脚本的参数。<br />
$_SERVER['argc'] #包含传递给程序的命令行参数的个数（如果运行在命令行模式）。<br />
$_SERVER['GATEWAY_INTERFACE'] #服务器使用的 CGI 规范的版本。例如，&#8220;CGI/1.1&#8221;。<br />
<span style="color: rgb(255,0,0)"><span style="color: #000000">$_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称。<br />
</span></span>$_SERVER['SERVER_SOFTWARE'] #服务器标识的字串，在响应请求时的头部中给出。<br />
$_SERVER['SERVER_PROTOCOL'] #请求页面时通信协议的名称和版本。例如，&#8220;HTTP/1.0&#8221;。<br />
$_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如：&#8220;GET&#8221;、&#8220;HEAD&#8221;，&#8220;POST&#8221;，&#8220;PUT&#8221;。<br />
$_SERVER['QUERY_STRING'] #查询(query)的字符串。<br />
$_SERVER['DOCUMENT_ROOT'] #当前运行脚本所在的文档根目录。在服务器配置文件中定义。<br />
$_SERVER['HTTP_ACCEPT'] #当前请求的 Accept: 头部的内容。<br />
$_SERVER['HTTP_ACCEPT_CHARSET'] #当前请求的 Accept-Charset: 头部的内容。例如：&#8220;iso-8859-1,*,utf-8&#8221;。<br />
$_SERVER['HTTP_ACCEPT_ENCODING'] #当前请求的 Accept-Encoding: 头部的内容。例如：&#8220;gzip&#8221;。<br />
$_SERVER['HTTP_ACCEPT_LANGUAGE']#当前请求的 Accept-Language: 头部的内容。例如：&#8220;en&#8221;。<br />
$_SERVER['HTTP_CONNECTION'] #当前请求的 Connection: 头部的内容。例如：&#8220;Keep-Alive&#8221;。<br />
$_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容。<br />
$_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址。<br />
$_SERVER['HTTP_USER_AGENT'] #当前请求的 User_Agent: 头部的内容。<br />
<span style="color: rgb(255,0,0)"><span style="color: #000000">$_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址。<br />
</span></span><span style="color: #000000">$_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名。</span><br />
$_SERVER['REMOTE_PORT'] #用户连接到服务器时所使用的端口。<br />
<span style="color: rgb(255,0,0)"><span style="color: #000000">$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。<br />
</span></span>$_SERVER['SERVER_ADMIN'] #管理员信息<br />
$_SERVER['SERVER_PORT'] #服务器所使用的端口<br />
$_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串。<br />
<span style="color: #000000">$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统（不是文档根目录）的基本路径。</span><br />
$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。<br />
$_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如，&#8220;/index.html&#8221;。<br />
$_SERVER['PHP_AUTH_USER'] #当 PHP 运行在 Apache 模块方式下，并且正在使用 HTTP 认证功能，这个变量便是用户输入的用户名。<br />
$_SERVER['PHP_AUTH_PW'] #当 PHP 运行在 Apache 模块方式下，并且正在使用 HTTP 认证功能，这个变量便是用户输入的密码。<br />
$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下，并且正在使用 HTTP 认证功能，这个变量便是认证的类型。 </div>
<img src ="http://www.blogjava.net/DreamFight/aggbug/262799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-03-30 07:11 <a href="http://www.blogjava.net/DreamFight/articles/262799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>set_magic_quotes_runtime(0)函数作用解释 </title><link>http://www.blogjava.net/DreamFight/articles/261934.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Wed, 25 Mar 2009 12:16:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/261934.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/261934.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/261934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/261934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/261934.html</trackback:ping><description><![CDATA[在php.ini的配置文件中，有个布尔值的设置，就是magic_quotes_runtime,当它打开时，php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。<br />
<br />
当然如果重复给溢出字符加反斜线，那么字符串中就会有多个反斜线，所以这时就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()设置和检测php.ini文件中magic_quotes_runtime状态。<br />
<br />
为了使自己的程序不管服务器是什么设置都能正常执行。可以在程序开始用get_magic_quotes_runtime检测设置状态秋决定是否要手工处理，或者在开始（或不需要自动转义的时候）用set_magic_quotes_runtime(0)关掉。<br />
<br />
magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的'"\加上反斜线。可以用get_magic_quotes_gpc()检测系统设置。如果没有打开这项设置，可以使用addslashes()函数添加，它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号（'）、双引号（"）、反斜线（\）与 NUL（NULL 字符）。<br />
<br />
应用实例见代码： <br />
PHP代码<br />
<div class="code"><br />
// 去除转义字符&nbsp;&nbsp;&nbsp;&nbsp;<br />
function stripslashes_array($array) {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (is_array($array)) {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($array as $k =&gt; $v) {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$array[$k] = stripslashes_array($v);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else if (is_string($array)) {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$array = stripslashes($array);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return $array;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; <br />
@set_magic_quotes_runtime(0);&nbsp;&nbsp;&nbsp;&nbsp;<br />
// 判断 magic_quotes_gpc 状态&nbsp;&nbsp;&nbsp;&nbsp;<br />
if (@get_magic_quotes_gpc()) {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//如果已经打开了magic_quotes_gpc，则去掉转义字符，防止双重转义&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;$_GET = stripslashes_array($_GET);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;$_POST = stripslashes_array($_POST);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;$_COOKIE = stripslashes_array($_COOKIE);&nbsp;&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp; <br />
</div>
<img src ="http://www.blogjava.net/DreamFight/aggbug/261934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-03-25 20:16 <a href="http://www.blogjava.net/DreamFight/articles/261934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows下开启PHP GD库</title><link>http://www.blogjava.net/DreamFight/articles/259850.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Sun, 15 Mar 2009 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/259850.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/259850.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/259850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/259850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/259850.html</trackback:ping><description><![CDATA[<p>根据不同的PHP版本，我用的PHP5解压包已经包含了GD库，</p>
<p>所以只需要在php.ini里找到&#8220;extension=php_gd2.dll&#8221;</p>
<p>然后吧前边的&#8220;；&#8221;去掉就OK了！</p>
<img src ="http://www.blogjava.net/DreamFight/aggbug/259850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-03-15 16:14 <a href="http://www.blogjava.net/DreamFight/articles/259850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置php.ini文件的路径</title><link>http://www.blogjava.net/DreamFight/articles/259849.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Sun, 15 Mar 2009 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/259849.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/259849.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/259849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/259849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/259849.html</trackback:ping><description><![CDATA[<p>php默认规定<strong>php.ini文件的路径</strong>必须在C:\windows路径下，其实这个路径是可以配置的。</p>
<p>我们可以简单的在apache中配置php的路径，在apache的conf\httpd.conf文件里面增加</p>
<pre># configure the path to php.ini
PHPIniDir "D:/php"
</pre>
<p>通过上面的配置就可以是php.ini与php.exe在同一个文件夹了。</p>
<p>据说系统会以下面的顺序查找php.ini的路径：</p>
<p>*conf\httpd.conf的PhpIniDir配置<br />
*注册表键regedit值HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath<br />
*当前工作目录(CLI)<br />
*网站服务器WWW目录(SAPI)，或PHP目录<br />
*Windows目录C:\windows or C:\winnt，或者&#8211;with-config-file-path compile time option</p>
<p>当然是第一种方法最好！</p>
<img src ="http://www.blogjava.net/DreamFight/aggbug/259849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2009-03-15 16:14 <a href="http://www.blogjava.net/DreamFight/articles/259849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>set_error_handler() 用法</title><link>http://www.blogjava.net/DreamFight/articles/248772.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Sun, 28 Dec 2008 11:51:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/248772.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/248772.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/248772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/248772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/248772.html</trackback:ping><description><![CDATA[<p>错误路径泄露<br />
1.漏洞原因：<br />
PHP遇到错误时，就会给出出错脚本的位置、行数和原因，例如：<br />
Notice: Use of undefined constant test - assumed ''test'' in D:interpubbigflytest.php on line 3<br />
有很多人说，这并没有什么大不了。但泄露了实际路径的后果是不堪设想的，对于某些入侵者，这个信息可是非常重要，而事实上现在有很多的服务器都存在这个问题。<br />
有些网管干脆把PHP配置文件中的display_errors设置为Off来解决，但本人认为这个方法过于消极。有些时候，我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待，甚至导航到另一页面。<br />
2.漏洞解决：<br />
PHP从4.1.0开始提供了自定义错误处理句柄的功能函数set_error_handler()，但很少数脚本编写者知道。在众多的PHP论坛中，我只看见很少一部分对此情况进行了处理。set_error_handler的使用方法如下：<br />
string set_error_handler ( callback error_handler [, int error_types])<br />
现在我们就用自定义的错误处理把实际路径过滤掉。<br />
//admin为管理员的身份判定，true为管理员。<br />
//自定义的错误处理函数一定要有这４个输入变量$errno,$errstr,$errfile,$errline，否则无效。<br />
function my_error_handler($errno,$errstr,$errfile,$errline)<br />
{<br />
//如果不是管理员就过滤实际路径<br />
if(!admin)<br />
{<br />
$errfile=str_replace(getcwd(),"",$errfile);<br />
$errstr=str_replace(getcwd(),"",$errstr);<br />
} <br />
switch($errno)<br />
{<br />
case E_ERROR:<br />
echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile)<br />
n";<br />
echo "程序已经停止运行，请联系管理员。";<br />
//遇到Error级错误时退出脚本<br />
exit;<br />
break;<br />
<br />
case E_WARNING:<br />
echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile)<br />
n";<br />
break;<br />
<br />
default:<br />
//不显示Notice级的错误<br />
break;<br />
}<br />
}<br />
<br />
//把错误处理设置为my_error_handler函数<br />
set_error_handler("my_error_handler");<br />
&#8230;<br />
这样，就可以很好地解决安全和调试方便的矛盾了。而且你还可以花点心思，使错误提示更加美观以配合网站的风格。不过注意两点是：<br />
（1）E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的，也就是会用最原始的方式显示出来。不过出现这些错误都是编译或PHP内核出错，在通常情况下不会发生。<br />
（2）使用set_error_handler()后，error_reporting ()将会失效。也就是所有的错误（除上述的错误）都会交给自定义的函数处理。<br />
其它有关于set_error_handler()的信息，大家可以参考PHP的官方手册。<br />
<br />
下面我举个实际应用中的例子：<br />
&lt;index.php&gt;<br />
&lt;?php<br />
//先定义一个函数，也可以定义在其他的文件中，再用require()调用<br />
function myErrorHandler($errno, $errstr, $errfile, $errline)<br />
{<br />
　　　　　//为了安全起见，不暴露出真实物理路径，下面两行过滤实际路径<br />
&nbsp;&nbsp;&nbsp;&nbsp;$errfile=str_replace(getcwd(),"",$errfile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$errstr=str_replace(getcwd(),"",$errstr);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;switch ($errno) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;case E_USER_ERROR:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; echo "&lt;b&gt;My ERROR&lt;/b&gt; [$errno] $errstr&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "&nbsp;&nbsp;Fatal error on line $errline in file $errfile";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Aborting...&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;case E_USER_WARNING:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "&lt;b&gt;My WARNING&lt;/b&gt; [$errno] $errstr&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;case E_USER_NOTICE:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "&lt;b&gt;My NOTICE&lt;/b&gt; [$errno] $errstr&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;default:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Unknown error type: [$errno] $errstr&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* Don't execute PHP internal error handler */<br />
&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />
}<br />
<br />
//下面开始连接MYSQL服务器，我们故意指定MYSQL端口为3333,实际为3306。<br />
$link_id=@mysql_pconnect("localhost:3333","root","password");<br />
set_error_handler(myErrorHandler);<br />
if (!$link_id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;trigger_error("出错了", E_USER_ERROR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
?&gt;</p>
<img src ="http://www.blogjava.net/DreamFight/aggbug/248772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-28 19:51 <a href="http://www.blogjava.net/DreamFight/articles/248772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下PHP安装具体步骤</title><link>http://www.blogjava.net/DreamFight/articles/248587.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Sat, 27 Dec 2008 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/248587.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/248587.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/248587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/248587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/248587.html</trackback:ping><description><![CDATA[<div class="tit">Windows下PHP安装具体步骤</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <p>PHP安装具体步骤<br />
            注意事项:安装过程，任何目录和文件名都不要使用空格，<br />
            不要使用D:\Program Files 而要使用D:\ProgramFiles<br />
            本次安装目录为D:\PHPServer\<br />
            1. apache_2.2.3-win32-x86-no_ssl.msi<br />
            apache服务器软件，我下载的是win版本，2.0系列的配置都是相似的。<br />
            双击安装apache2.2.3,我把它安装到D:\PHPServer\Apache2\ 注意，目录名不要包含空格，否则下面设置php会出错。安装结束后，apache自动运行，在浏览器里输入<a href="http://127.0.0.1/">http://127.0.0.1</a>是不是显示出了默认的网页，如果你不希望看到这个页面，可以到D:\PHPServer\Apache2\conf目录下找到 httpd.conf 打开编辑，并查找 DocumentRoot"在2.0系列的版本中，只会找到一个DocumentRoot" ，把引号内的路径改为你自己的路径就可以了，比如 DocumentRoot &#8220;D:/PHPServer&#8221; 现在默认的根目录就是 D:/PHPServer 注意这里用的是"/"。</p>
            <p>备注:如果是ZIP的压缩包的话,只需要把Apache2.2解压到目录,然后CMD下运行<br />
            D:\PHPServer\Apache2\bin\httpd -k install :安装<br />
            D:\PHPServer\Apache2\bin\httpd -k start :开始<br />
            就行了</p>
            <p>2、安装php5.2<br />
            下载过来的php-5.2-Win32一般是个zip格式的压缩包，解压缩到D:\PHPServer目录下，并使文件都在一个文件夹下，改文件夹名为php5 ,这样方便接下来的工作。现在我们看到 D:\PHPServer下面已经有两个文件夹了, 一个是 apache2(安装apache2.2.3自动生成的一个文件夹) 另一个是 php5 我的方式是每一个软件一个文件夹,并且这些文件夹在同一目录下, 这样便于查找。好了，我们现在开始配置apache使它支持php5.<br />
            首先,找到 D:\PHPServer\php5 目录下的php.ini-dist 重命名为php.ini 并复制到C:\windows 目录下,<br />
            然后,复制 D:\PHPServer\php5 目录下的php5ts.dll,libmysql.dll(&nbsp;加载php和apache的动态链接库)到C:\windows\system32<br />
            最后,复制 D:\PHPServer\php5\ext 目录下的php_gd2.dll，php_mysql.dll 到C:\windows\system32</p>
            <p>也可把以下命令COPY为BAT文件<br />
            @echo off<br />
            copy libmysql.dll %windir%\system32\<br />
            copy php5ts.dll %windir%\system32\<br />
            copy ext/php_gd2.dll %windir%\system32\<br />
            copy ext/php_mysql.dll %windir%\system32\<br />
            copy php.ini %windir%\<br />
            放在php5的根目录运行</p>
            <p>接下去,我们开始配置 D:\PHPServer\Apache\Apache2\conf 下的 httpd.conf文件,打开apache配置文件httpd.conf:开始/程序/Apache HTTP Server/Configure Apache Server/Edit....<br />
            1、找到DirectoryIndex index.html 在后面加入 index.htm index.html.var index.php<br />
            2、模块化安装配置<br />
            找到 #LoadModule ssl_module modules/mod_ssl.so 这行,在此行后加入一行<br />
            LoadModule php5_module D:/PHPServer/php5/php5apache2_2.dll(下面有说明)<br />
            其中D:/PHPServer/php5/ 为你php目录<br />
            3、找到 AddType application/x-gzip .gz .tgz 这行,加入如下即可<br />
            AddType application/x-httpd-php .php<br />
            4、验证Apache整合PHP<br />
            新建一个PHP文件：phpinfo.php<br />
            &lt;?echo phpinfo();?&gt;</p>
            <p>为了让php支持mysql,需要做如下操作:<br />
            首先修改c:\windows下的php.ini文件, <br />
            将 extension_dir = "./"修改为extension_dir = "d:\PHPServer\php5\ext",<br />
            将register_globals = Off改为On;<br />
            将;extension=php_mysql.dll前面的引号";"去掉<br />
            再复制php目录下的libmysql.dll文件到system32下<br />
            <br />
            测试MySQL,在Web根目录下建立testdb.php文件内容如下：<br />
            &lt;?php<br />
            $link=mysql_connect('localhost','root','123456');<br />
            if(!$link) echo "fail";<br />
            else echo "success";<br />
            mysql_close();<br />
            ?&gt;</p>
            <p>安装phpMyAdmin:<br />
            将phpMyadmin解压到apache的网页目录,为了方便后序操作将文件夹重命名为pma.</p>
            <p>PHPMyAdmin配置<br />
            在libraries\config.default.php中<br />
            $cfg['Servers'][$i]['user']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 'root';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // MySQL user<br />
            $cfg['Servers'][$i]['password']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 'your password';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // MySQL password (only needed<br />
            加入用户名和密码</p>
            <p><br />
            注意事项<br />
            装了mysql后外部不能连接<br />
            打开XP防火墙的3306端口,允许外部访问.当然如果你装了其他的防火墙也要打开此端口.<br />
            <br />
            mysqlfront 不能连接的问题,报1251错误<br />
            在本机用其他工具和命令行都可以连, 在另外一台linux上也可以连,将加密方式改为了old_password也不行,但是今天来开机发现可以连了.或许是要重启以下吧,呵呵.<br />
            <br />
            进入phpMyAdmin时, 出现 &#8220;无法载入 mysql 扩展，请检查 PHP 配置&#8221;。这里或许是显示的乱码,你要在IE的编码中选择简体中文就会看到.<br />
            解决办法就是上面说的要让php支持mysql,设置扩展文件的的路径,打开扩展项.</p>
            <p>进入phpMyAdmin的管理页面以后,网页下方出现mbstring的警告,<br />
            解决:在php.ini中将此扩展打开,将;extension=php_mbstring.dll前面的引号去掉即可</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/DreamFight/aggbug/248587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-27 09:01 <a href="http://www.blogjava.net/DreamFight/articles/248587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php生成静态所要到的类</title><link>http://www.blogjava.net/DreamFight/articles/246294.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Sun, 14 Dec 2008 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/246294.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/246294.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/246294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/246294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/246294.html</trackback:ping><description><![CDATA[&lt;?php<br />
/*<br />
Author：DreamFight<br />
使用方法 <br />
$shtml = new Shtml($Url,$FileBag,$FolderName,$fileid) <br />
$Url： 页面 URL 地址 <br />
$FileBag： 文件夹标记 1 为：指定文件夹 <br />
2为：默认文件夹(时间(年月日)) <br />
$FolderRoot html文件存放路径 <br />
$FolderName 指定文件夹的名称 $FileBag为2时 可以写为空(""); <br />
$fileid 静态页面名称(后缀 默认为 .html) <br />
&nbsp;*/<br />
?&gt;<br />
class Shtml <br />
{ <br />
var $message1="Error 1: You write class Shtml is Wrong ! The second parameter is 1 or 2 in this class!."; <br />
var $message2="Error 2: The file write Error."; <br />
<br />
<br />
function __construct ($Url,$FileBag,$FolderRoot,$FolderName,$fileid) <br />
{ <br />
$this-&gt;Url = $Url; <br />
$this-&gt;FileBag = $FileBag; <br />
$this-&gt;FileRoot = $FolderRoot; <br />
$this-&gt;FileName = $FolderName; <br />
$this-&gt;fileid = $fileid; <br />
Shtml::useFolder (); <br />
} <br />
<br />
/*************获取数据*******************/ <br />
public function loadcontent ($Folder) <br />
{ <br />
ob_start(); <br />
require_once $this-&gt;Url; <br />
Shtml::writehtml ($Folder,ob_get_contents()); <br />
ob_clean(); <br />
} <br />
<br />
/********** 指定文件夹*****************/ <br />
public function useFolder () <br />
{ <br />
if($this-&gt;FileBag==1) <br />
{ <br />
$Folder=$this-&gt;FileName; <br />
} <br />
else if($this-&gt;FileBag==2) <br />
{ <br />
$Folder=date('Ymd',time()); <br />
} <br />
else <br />
{ <br />
exit($this-&gt;message1); <br />
} <br />
if(!is_dir($this-&gt;FileRoot.$Folder)){ mkdir($this-&gt;FileRoot.$Folder,0700);} <br />
<br />
Shtml::loadcontent ($Folder); <br />
<br />
} <br />
/********** 生成静态页面*****************/ <br />
public function writehtml ($Folder,$cache_value) <br />
{ <br />
$file = fopen($this-&gt;FileRoot.$Folder.'/'.$this-&gt;fileid.'.html','w+'); <br />
fwrite($file,$cache_value); <br />
fclose($file); <br />
} <br />
<br />
} <br />
<img src ="http://www.blogjava.net/DreamFight/aggbug/246294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-15 00:06 <a href="http://www.blogjava.net/DreamFight/articles/246294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天需要用到在smarty模版中将两个变量相加</title><link>http://www.blogjava.net/DreamFight/articles/245578.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Wed, 10 Dec 2008 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/245578.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/245578.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/245578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/245578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/245578.html</trackback:ping><description><![CDATA[<ol>
    <li class="hl-firstline"><span style="color: olive">{</span><span style="color: gray">* </span><span style="color: #00008b">$height</span><span style="color: gray">=</span><span style="color: maroon">4</span><span style="color: gray">, </span><span style="color: #00008b">$width</span><span style="color: gray">=</span><span style="color: maroon">5</span><span style="color: gray"> *</span><span style="color: olive">}</span>
    <li><span style="color: olive">{</span><span style="color: blue">math</span><span style="color: gray">&nbsp;</span><span style="color: blue">equation</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">x + y</span><span style="color: #8b0000">"</span><span style="color: gray"> </span><span style="color: blue">x</span><span style="color: gray">=</span><span style="color: #00008b">$height</span><span style="color: gray"> </span><span style="color: blue">y</span><span style="color: gray">=</span><span style="color: #00008b">$width</span><span style="color: olive">}</span>
    <li><span style="color: blue">OUTPUT</span><span style="color: gray">:</span>
    <li><span style="color: maroon">9</span>
    <li><br />
    <li><span style="color: olive">{</span><span style="color: gray">* </span><span style="color: #00008b">$row_height</span><span style="color: gray"> = </span><span style="color: maroon">10</span><span style="color: gray">, </span><span style="color: #00008b">$row_width</span><span style="color: gray"> = </span><span style="color: maroon">20</span><span style="color: gray">, </span><span style="color: #ffa500">#col_div# = 2, assigned in template *}</span>
    <li><span style="color: olive">{</span><span style="color: blue">math</span><span style="color: gray">&nbsp;</span><span style="color: blue">equation</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">height * width / division</span><span style="color: #8b0000">"</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: blue">height</span><span style="color: gray">=</span><span style="color: #00008b">$row_height</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: blue">width</span><span style="color: gray">=</span><span style="color: #00008b">$row_width</span>
    <li><span style="color: gray">&nbsp; &nbsp; &nbsp; </span><span style="color: blue">division</span><span style="color: gray">=</span><span style="color: #ffa500">#col_div#}</span>
    <li><span style="color: blue">OUTPUT</span><span style="color: gray">:</span>
    <li><span style="color: maroon">100</span>
    <li><br />
    <li><span style="color: olive">{</span><span style="color: gray">* </span><span style="color: blue">you</span><span style="color: gray">&nbsp;</span><span style="color: blue">can</span><span style="color: gray"> </span><span style="color: blue">use</span><span style="color: gray"> </span><span style="color: blue">parenthesis</span><span style="color: gray"> *</span><span style="color: olive">}</span>
    <li><span style="color: olive">{</span><span style="color: blue">math</span><span style="color: gray">&nbsp;</span><span style="color: blue">equation</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">(( x + y ) / z )</span><span style="color: #8b0000">"</span><span style="color: gray"> </span><span style="color: blue">x</span><span style="color: gray">=</span><span style="color: maroon">2</span><span style="color: gray"> </span><span style="color: blue">y</span><span style="color: gray">=</span><span style="color: maroon">10</span><span style="color: gray"> </span><span style="color: blue">z</span><span style="color: gray">=</span><span style="color: maroon">2</span><span style="color: olive">}</span>
    <li><span style="color: blue">OUTPUT</span><span style="color: gray">:</span>
    <li><span style="color: maroon">6</span>
    <li><br />
    <li><span style="color: olive">{</span><span style="color: gray">* </span><span style="color: blue">you</span><span style="color: gray">&nbsp;</span><span style="color: blue">can</span><span style="color: gray"> </span><span style="color: blue">supply</span><span style="color: gray"> </span><span style="color: blue">a</span><span style="color: gray"> </span><span style="color: blue">format</span><span style="color: gray"> </span><span style="color: blue">parameter</span><span style="color: gray"> </span><span style="color: blue">in</span><span style="color: gray"> </span><span style="color: blue">sprintf</span><span style="color: gray"> </span><span style="color: blue">format</span><span style="color: gray"> *</span><span style="color: olive">}</span>
    <li><span style="color: olive">{</span><span style="color: blue">math</span><span style="color: gray">&nbsp;</span><span style="color: blue">equation</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">x + y</span><span style="color: #8b0000">"</span><span style="color: gray"> </span><span style="color: blue">x</span><span style="color: gray">=</span><span style="color: maroon">4.4444</span><span style="color: gray"> </span><span style="color: blue">y</span><span style="color: gray">=</span><span style="color: maroon">5.0000</span><span style="color: gray"> </span><span style="color: blue">format</span><span style="color: gray">=</span><span style="color: #8b0000">"</span><span style="color: red">%.2f</span><span style="color: #8b0000">"</span><span style="color: olive">}</span>
    <li><span style="color: blue">OUTPUT</span><span style="color: gray">:</span>
    <li><span style="color: maroon">9.44</span> </li>
</ol>
<img src ="http://www.blogjava.net/DreamFight/aggbug/245578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-10 22:11 <a href="http://www.blogjava.net/DreamFight/articles/245578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>set_error_handler() 用法</title><link>http://www.blogjava.net/DreamFight/articles/245338.html</link><dc:creator>DreamFight</dc:creator><author>DreamFight</author><pubDate>Tue, 09 Dec 2008 13:23:00 GMT</pubDate><guid>http://www.blogjava.net/DreamFight/articles/245338.html</guid><wfw:comment>http://www.blogjava.net/DreamFight/comments/245338.html</wfw:comment><comments>http://www.blogjava.net/DreamFight/articles/245338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/DreamFight/comments/commentRss/245338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DreamFight/services/trackbacks/245338.html</trackback:ping><description><![CDATA[PHP遇到错误时，就会给出出错脚本的位置、行数和原因，例如：<br />
Notice: Use of undefined constant test - assumed ''test'' in D:interpubbigflytest.php on line 3<br />
有很多人说，这并没有什么大不了。但泄露了实际路径的后果是不堪设想的，对于某些入侵者，这个信息可是非常重要，而事实上现在有很多的服务器都存在这个问题。<br />
有些网管干脆把PHP配置文件中的display_errors设置为Off来解决，但本人认为这个方法过于消极。有些时候，我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待，甚至导航到另一页面。<br />
2.漏洞解决：<br />
PHP从4.1.0开始提供了自定义错误处理句柄的功能函数set_error_handler()，但很少数脚本编写者知道。在众多的PHP论坛中，我只看见很少一部分对此情况进行了处理。set_error_handler的使用方法如下：<br />
string set_error_handler ( callback error_handler [, int error_types])<br />
现在我们就用自定义的错误处理把实际路径过滤掉。<br />
//admin为管理员的身份判定，true为管理员。<br />
//自定义的错误处理函数一定要有这４个输入变量$errno,$errstr,$errfile,$errline，否则无效。<br />
function my_error_handler($errno,$errstr,$errfile,$errline)<br />
{<br />
//如果不是管理员就过滤实际路径<br />
if(!admin)<br />
{<br />
$errfile=str_replace(getcwd(),"",$errfile);<br />
$errstr=str_replace(getcwd(),"",$errstr);<br />
} <br />
switch($errno)<br />
{<br />
case E_ERROR:<br />
echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile)<br />
n";<br />
echo "程序已经停止运行，请联系管理员。";<br />
//遇到Error级错误时退出脚本<br />
exit;<br />
break;<br />
<br />
case E_WARNING:<br />
echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile)<br />
n";<br />
break;<br />
<br />
default:<br />
//不显示Notice级的错误<br />
break;<br />
}<br />
}<br />
<br />
//把错误处理设置为my_error_handler函数<br />
set_error_handler("my_error_handler");<br />
&#8230;<br />
这样，就可以很好地解决安全和调试方便的矛盾了。而且你还可以花点心思，使错误提示更加美观以配合网站的风格。不过注意两点是：<br />
（1）E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的，也就是会用最原始的方式显示出来。不过出现这些错误都是编译或PHP内核出错，在通常情况下不会发生。<br />
（2）使用set_error_handler()后，error_reporting ()将会失效。也就是所有的错误（除上述的错误）都会交给自定义的函数处理。<br />
其它有关于set_error_handler()的信息，大家可以参考PHP的官方手册。<br />
<br />
下面我举个实际应用中的例子：<br />
&lt;index.php&gt;<br />
&lt;?php<br />
//先定义一个函数，也可以定义在其他的文件中，再用require()调用<br />
function myErrorHandler($errno, $errstr, $errfile, $errline)<br />
{<br />
　　　　　//为了安全起见，不暴露出真实物理路径，下面两行过滤实际路径<br />
&nbsp;&nbsp;&nbsp;&nbsp;$errfile=str_replace(getcwd(),"",$errfile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$errstr=str_replace(getcwd(),"",$errstr);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;switch ($errno) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;case E_USER_ERROR:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; echo "&lt;b&gt;My ERROR&lt;/b&gt; [$errno] $errstr&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "&nbsp;&nbsp;Fatal error on line $errline in file $errfile";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Aborting...&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;case E_USER_WARNING:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "&lt;b&gt;My WARNING&lt;/b&gt; [$errno] $errstr&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;case E_USER_NOTICE:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "&lt;b&gt;My NOTICE&lt;/b&gt; [$errno] $errstr&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;default:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Unknown error type: [$errno] $errstr&lt;br /&gt;\n";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* Don't execute PHP internal error handler */<br />
&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />
}<br />
<br />
//下面开始连接MYSQL服务器，我们故意指定MYSQL端口为3333,实际为3306。<br />
$link_id=@mysql_pconnect("localhost:3333","root","password");<br />
set_error_handler(myErrorHandler);<br />
if (!$link_id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;trigger_error("出错了", E_USER_ERROR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
?&gt;<br />
 <img src ="http://www.blogjava.net/DreamFight/aggbug/245338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DreamFight/" target="_blank">DreamFight</a> 2008-12-09 21:23 <a href="http://www.blogjava.net/DreamFight/articles/245338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>