<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>小凡陋站 &#187; php</title>
	<atom:link href="http://kuigg.com/cat/learning/php/feed" rel="self" type="application/rss+xml" />
	<link>http://kuigg.com</link>
	<description>覃伟帆个人博客</description>
	<lastBuildDate>Fri, 06 Aug 2010 08:16:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>你应该知道的PHP十件事</title>
		<link>http://kuigg.com/php-10jiansh</link>
		<comments>http://kuigg.com/php-10jiansh#comments</comments>
		<pubDate>Thu, 10 Jun 2010 14:16:51 +0000</pubDate>
		<dc:creator>kuiGG</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[学习资料]]></category>

		<guid isPermaLink="false">http://kuigg.com/?p=291</guid>
		<description><![CDATA[1.使用ip2long() 和long2ip()函数来把IP地址转化成整型存储到数据库里。
这种方法把存储空间降到了接近四分之一（char(15)的15个字节对整形的4个字节），计算一个特定的地址是不是在一个区段内也更简单了，而且加快了搜索和排序的速度（虽然有时仅仅是快了一点）。
2.在验证Email地址的时候使用checkdnsrr() 函数验证域名是否存在。
这个内置函数能够确认指定的域名能够解析成IP地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数，这个函数基于checkdnsrr()，用来验证 email 地址的合法性。对于那些认为自己的Email地址是user@www163.com而不是user@163.com的家伙们，这个方法可以很方便的抓住他们。
3.如果你使用的是PHP 5和MySQL 4.1 或者更高的版本，考虑用mysqli_* 系列函数。
一个很好的功能就是你可以使用预处理语句，如果你在维护一个数据库密集型站点，这个功能能够加快查询速度。一些评估分数。
4.学会爱上三元运算符。
5.如果你在项目中感觉到有可复用的部分，在你写下一行代码前先看看PEAR中是否已经有了。
很多PHP程序员都知道 PEAR 是一个很好的资源库，虽然还有很多程序员不知道。这个在线资源库包含了超过400个可以复用的程序片段，这些程序片段你可以立即用刀你的程序里。除非说你的项目真的是非常特别的，你总能找到帮你节省时间的 PEAR包。
6.用 highlight_file()来自动的打印出格式化的很漂亮的源代码。
如果你在留言板、IRC 这些地方寻求一个脚本的帮助的话，这个函数用起来非常的顺手。当然了，要小心不要意外的泄露出你的数据库连接信息和密码等。
7.使用 error_reporting(0)函数来防止用户看到潜在的敏感错误信息。
在理想情况下，发布服务器应该在php.ini 里完全禁止。但是如果你用的是一个共享的 web 服务器的话，你没有自己的 php.ini 文件，那么这种情况下你最好的选择就是在所有脚本的第一行前加上 error_reporting(0);（或者使用 require_once() 方法）。这就能够在出错的时候完全屏蔽敏感的SQL查询语句和路径名。
8.在网数据库中存储很大的字符串之前使用 gzcompress() 和 gzuncompress() 来显式的压缩/解压字符串。
这个PHP内置函数使用 gzip 算法，可以压缩普通文本达 90%。在我每次要读写BLOB类型的字段的时候都使用这些函数。唯一额例外就是当我需要全文检索的时候。
9.通过“引用”传递参数的方法从一个函数中得到多个返回值。
就像三元运算符一样，大部分受过正式编程训练的程序员都知道这个技巧。但是那些 HTML 背景大于 Pascal 背景的程序员都或多或少的有过这样的疑问“在仅能使用一次 return 的情况下，从一个函数里返回多个值？”答案就是在变量前加上一个 “&#38;” 符号，通过“引用”传递而非“值”传递。
10.完全理解“魔术引号”和 SQL 注入的危险性。
]]></description>
			<content:encoded><![CDATA[<p>1.使用ip2long() 和long2ip()函数来把IP地址转化成整型存储到数据库里。<br />
这种方法把存储空间降到了接近四分之一（char(15)的15个字节对整形的4个字节），计算一个特定的地址是不是在一个区段内也更简单了，而且加快了搜索和排序的速度（虽然有时仅仅是快了一点）。</p>
<p>2.在验证Email地址的时候使用checkdnsrr() 函数验证域名是否存在。</p>
<p>这个内置函数能够确认指定的域名能够解析成IP地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数，这个函数基于checkdnsrr()，用来验证 email 地址的合法性。对于那些认为自己的Email地址是<a href="mailto:user@www163.com">user@www163.com</a>而不是<a href="mailto:user@163.com">user@163.com</a>的家伙们，这个方法可以很方便的抓住他们。</p>
<p>3.如果你使用的是PHP 5和MySQL 4.1 或者更高的版本，考虑用mysqli_* 系列函数。</p>
<p>一个很好的功能就是你可以使用预处理语句，如果你在维护一个数据库密集型站点，这个功能能够加快查询速度。一些评估分数。</p>
<p>4.学会爱上三元运算符。</p>
<p>5.如果你在项目中感觉到有可复用的部分，在你写下一行代码前先看看PEAR中是否已经有了。</p>
<p>很多PHP程序员都知道 PEAR 是一个很好的资源库，虽然还有很多程序员不知道。这个在线资源库包含了超过400个可以复用的程序片段，这些程序片段你可以立即用刀你的程序里。除非说你的项目真的是非常特别的，你总能找到帮你节省时间的 PEAR包。</p>
<p>6.用 highlight_file()来自动的打印出格式化的很漂亮的源代码。</p>
<p>如果你在留言板、IRC 这些地方寻求一个脚本的帮助的话，这个函数用起来非常的顺手。当然了，要小心不要意外的泄露出你的数据库连接信息和密码等。</p>
<p>7.使用 error_reporting(0)函数来防止用户看到潜在的敏感错误信息。</p>
<p>在理想情况下，发布服务器应该在php.ini 里完全禁止。但是如果你用的是一个共享的 web 服务器的话，你没有自己的 php.ini 文件，那么这种情况下你最好的选择就是在所有脚本的第一行前加上 error_reporting(0);（或者使用 require_once() 方法）。这就能够在出错的时候完全屏蔽敏感的SQL查询语句和路径名。</p>
<p>8.在网数据库中存储很大的字符串之前使用 gzcompress() 和 gzuncompress() 来显式的压缩/解压字符串。</p>
<p>这个PHP内置函数使用 gzip 算法，可以压缩普通文本达 90%。在我每次要读写BLOB类型的字段的时候都使用这些函数。唯一额例外就是当我需要全文检索的时候。</p>
<p>9.通过“引用”传递参数的方法从一个函数中得到多个返回值。</p>
<p>就像三元运算符一样，大部分受过正式编程训练的程序员都知道这个技巧。但是那些 HTML 背景大于 Pascal 背景的程序员都或多或少的有过这样的疑问“在仅能使用一次 return 的情况下，从一个函数里返回多个值？”答案就是在变量前加上一个 “&amp;” 符号，通过“引用”传递而非“值”传递。</p>
<p>10.完全理解“魔术引号”和 SQL 注入的危险性。</p>
]]></content:encoded>
			<wfw:commentRss>http://kuigg.com/php-10jiansh/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>收集一些常用的正则表达式</title>
		<link>http://kuigg.com/changyong-zhengze</link>
		<comments>http://kuigg.com/changyong-zhengze#comments</comments>
		<pubDate>Thu, 10 Jun 2010 13:00:50 +0000</pubDate>
		<dc:creator>kuiGG</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[学习资料]]></category>

		<guid isPermaLink="false">http://kuigg.com/?p=287</guid>
		<description><![CDATA[&#8220;^\d+$&#8221;　　//非负整数（正整数 + 0）
&#8220;^[0-9]*[1-9][0-9]*$&#8221;　　//正整数
&#8220;^((-\d+)&#124;(0+))$&#8221;　　//非正整数（负整数 + 0）
&#8220;^-[0-9]*[1-9][0-9]*$&#8221;　　//负整数
&#8220;^-?\d+$&#8221;　　　　//整数
&#8220;^\d+(\.\d+)?$&#8221;　　//非负浮点数（正浮点数 + 0）
&#8220;^(([0-9]+\.[0-9]*[1-9][0-9]*)&#124;([0-9]*[1-9][0-9]*\.[0-9]+)&#124;([0-9]*[1-9][0-9]*))$&#8221;　　//正浮点数
&#8220;^((-\d+(\.\d+)?)&#124;(0+(\.0+)?))$&#8221;　　//非正浮点数（负浮点数 + 0）
&#8220;^(-(([0-9]+\.[0-9]*[1-9][0-9]*)&#124;([0-9]*[1-9][0-9]*\.[0-9]+)&#124;([0-9]*[1-9][0-9]*)))$&#8221;　　//负浮点数
&#8220;^(-?\d+)(\.\d+)?$&#8221;　　//浮点数
&#8220;^[A-Za-z]+$&#8221;　　//由26个英文字母组成的字符串
&#8220;^[A-Z]+$&#8221;　　//由26个英文字母的大写组成的字符串
&#8220;^[a-z]+$&#8221;　　//由26个英文字母的小写组成的字符串
&#8220;^[A-Za-z0-9]+$&#8221;　　//由数字和26个英文字母组成的字符串
&#8220;^\w+$&#8221;　　//由数字、26个英文字母或者下划线组成的字符串
&#8220;^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$&#8221;　　　　//email地址
&#8220;^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$&#8221;　　//url
/^(d{2}&#124;d{4})-((0([1-9]{1}))&#124;(1[1&#124;2]))-(([0-2]([1-9]{1}))&#124;(3[0&#124;1]))$/   //  年-月-日
/^((0([1-9]{1}))&#124;(1[1&#124;2]))/(([0-2]([1-9]{1}))&#124;(3[0&#124;1]))/(d{2}&#124;d{4})$/   // 月/日/年
&#8220;^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)&#124;(([w-]+.)+))([a-zA-Z]{2,4}&#124;[0-9]{1,3})(]?)$&#8221;   //Emil
/^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)&#124;([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/     //电话号码
&#8220;^(d{1,2}&#124;1dd&#124;2[0-4]d&#124;25[0-5]).(d{1,2}&#124;1dd&#124;2[0-4]d&#124;25[0-5]).(d{1,2}&#124;1dd&#124;2[0-4]d&#124;25[0-5]).(d{1,2}&#124;1dd&#124;2[0-4]d&#124;25[0-5])$&#8221;   //IP地址
匹配中文字符的正则表达式： [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内)：[^\x00-\xff]
匹配空行的正则表达式：\n[\s&#124; ]*\r
匹配HTML标记的正则表达式：/&#60;(.*)&#62;.*&#60;\/\1&#62;&#124;&#60;(.*) \/&#62;/
匹配首尾空格的正则表达式：(^\s*)&#124;(\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}-&#124;\d{4}-)?(\d{8}&#124;\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 [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;^\d+$&#8221;　　//非负整数（正整数 + 0）<br />
&#8220;^[0-9]*[1-9][0-9]*$&#8221;　　//正整数<br />
&#8220;^((-\d+)|(0+))$&#8221;　　//非正整数（负整数 + 0）<br />
&#8220;^-[0-9]*[1-9][0-9]*$&#8221;　　//负整数<br />
&#8220;^-?\d+$&#8221;　　　　//整数<br />
&#8220;^\d+(\.\d+)?$&#8221;　　//非负浮点数（正浮点数 + 0）<br />
&#8220;^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$&#8221;　　//正浮点数<br />
&#8220;^((-\d+(\.\d+)?)|(0+(\.0+)?))$&#8221;　　//非正浮点数（负浮点数 + 0）<br />
&#8220;^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$&#8221;　　//负浮点数<br />
&#8220;^(-?\d+)(\.\d+)?$&#8221;　　//浮点数<br />
&#8220;^[A-Za-z]+$&#8221;　　//由26个英文字母组成的字符串<br />
&#8220;^[A-Z]+$&#8221;　　//由26个英文字母的大写组成的字符串<br />
&#8220;^[a-z]+$&#8221;　　//由26个英文字母的小写组成的字符串<br />
&#8220;^[A-Za-z0-9]+$&#8221;　　//由数字和26个英文字母组成的字符串<br />
&#8220;^\w+$&#8221;　　//由数字、26个英文字母或者下划线组成的字符串<br />
&#8220;^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$&#8221;　　　　//email地址<br />
&#8220;^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$&#8221;　　//url<br />
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日<br />
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年<br />
&#8220;^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$&#8221;   //Emil<br />
/^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/     //电话号码<br />
&#8220;^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$&#8221;   //IP地址</p>
<p>匹配中文字符的正则表达式： [\u4e00-\u9fa5]<br />
匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />
匹配空行的正则表达式：\n[\s| ]*\r<br />
匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/<br />
匹配首尾空格的正则表达式：(^\s*)|(\s*$)<br />
匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br />
匹配网址URL的正则表达式：^[a-zA-z]+://(<a href="file://w+(-//w+)*)(//.(//w+(-//w+)*))*(//?\\S*)?$">\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$</a><br />
匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />
匹配国内电话号码：(\d{3}-|\d{4}-)?(\d{8}|\d{7})?<br />
匹配腾讯QQ号：^[1-9]*[1-9][0-9]*$<br />
元字符及其在正则表达式上下文中的行为：</p>
<p>\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。</p>
<p>^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性，^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。</p>
<p>$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性，$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。</p>
<p>* 匹配前面的子表达式零次或多次。</p>
<p>+ 匹配前面的子表达式一次或多次。+ 等价于 {1,}。</p>
<p>? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。</p>
<p>{n} n 是一个非负整数，匹配确定的n 次。</p>
<p>{n,} n 是一个非负整数，至少匹配n 次。</p>
<p>{n,m} m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。</p>
<p>? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。</p>
<p>. 匹配除 &#8220;\n&#8221; 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符，请使用象 ’[.\n]’ 的模式。<br />
(pattern) 匹配pattern 并获取这一匹配。</p>
<p>(?:pattern) 匹配pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。</p>
<p>(?=pattern) 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。</p>
<p>(?!pattern) 负向预查，与(?=pattern)作用相反</p>
<p>x|y 匹配 x 或 y。</p>
<p>[xyz] 字符集合。</p>
<p>[^xyz] 负值字符集合。</p>
<p>[a-z] 字符范围，匹配指定范围内的任意字符。</p>
<p>[^a-z] 负值字符范围，匹配任何不在指定范围内的任意字符。</p>
<p>\b 匹配一个单词边界，也就是指单词和空格间的位置。</p>
<p>\B 匹配非单词边界。</p>
<p>\cx 匹配由x指明的控制字符。</p>
<p>\d 匹配一个数字字符。等价于 [0-9]。</p>
<p>\D 匹配一个非数字字符。等价于 [^0-9]。</p>
<p>\f 匹配一个换页符。等价于 \x0c 和 \cL。</p>
<p>\n 匹配一个换行符。等价于 \x0a 和 \cJ。</p>
<p>\r 匹配一个回车符。等价于 \x0d 和 \cM。</p>
<p>\s 匹配任何空白字符，包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。</p>
<p>\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</p>
<p>\t 匹配一个制表符。等价于 \x09 和 \cI。</p>
<p>\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。</p>
<p>\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。</p>
<p>\W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。</p>
<p>\xn 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。</p>
<p>\num 匹配 num，其中num是一个正整数。对所获取的匹配的引用。</p>
<p>\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。</p>
<p>\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm 为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。</p>
<p>\nml 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。</p>
<p>\un 匹配 n，其中 n 是一个用四个十六进制数字表示的Unicode字符。</p>
<p>匹配中文字符的正则表达式： [u4e00-u9fa5]</p>
<p>匹配双字节字符(包括汉字在内)：[^x00-xff]</p>
<p>匹配空行的正则表达式：n[s| ]*r</p>
<p>匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;/1&gt;|&lt;(.*) /&gt;/</p>
<p>匹配首尾空格的正则表达式：(^s*)|(s*$)</p>
<p>匹配Email地址的正则表达式：w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*</p>
<p>匹配网址URL的正则表达式：<a href="http://([w-]+.)+[w-]+(/[w">http://([w-]+.)+[w-]+(/[w</a>- ./?%&amp;=]*)?</p>
<p>利用正则表达式限制网页表单里的文本框输入内容：</p>
<p>用正则表达式限制只能输入中文：onkeyup=&#8221;value=value.replace(/[^u4E00-u9FA5]/g,&#8221;)&#8221; onbeforepaste=&#8221;clipboardData.setData(&#8216;text&#8217;,clipboardData.getData(&#8216;text&#8217;).replace(/[^u4E00-u9FA5]/g,&#8221;))&#8221;</p>
<p>用正则表达式限制只能输入全角字符： onkeyup=&#8221;value=value.replace(/[^uFF00-uFFFF]/g,&#8221;)&#8221; onbeforepaste=&#8221;clipboardData.setData(&#8216;text&#8217;,clipboardData.getData(&#8216;text&#8217;).replace(/[^uFF00-uFFFF]/g,&#8221;))&#8221;</p>
<p>用正则表达式限制只能输入数字：onkeyup=&#8221;value=value.replace(/[^d]/g,&#8221;) &#8220;onbeforepaste=&#8221;clipboardData.setData(&#8216;text&#8217;,clipboardData.getData(&#8216;text&#8217;).replace(/[^d]/g,&#8221;))&#8221;</p>
<p>用正则表达式限制只能输入数字和英文：onkeyup=&#8221;value=value.replace(/[W]/g,&#8221;) &#8220;onbeforepaste=&#8221;clipboardData.setData(&#8216;text&#8217;,clipboardData.getData(&#8216;text&#8217;).replace(/[^d]/g,&#8221;))&#8221;</p>
<p>=========常用正则式</p>
<p>匹配中文字符的正则表达式： [\u4e00-\u9fa5]</p>
<p>匹配双字节字符(包括汉字在内)：[^\x00-\xff]</p>
<p>匹配空行的正则表达式：\n[\s| ]*\r</p>
<p>匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/</p>
<p>匹配首尾空格的正则表达式：(^\s*)|(\s*$)</p>
<p>匹配IP地址的正则表达式：/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //</p>
<p>匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*</p>
<p>匹配网址URL的正则表达式：<a href="http://(/[/w-]+/.)+[/w-]+(/[/w">http://(/[\w-]+\.)+[\w-]+(/[\w</a>- ./?%&amp;=]*)?</p>
<p>sql语句：^(select|drop|delete|create|update|insert).*$</p>
<p>1、非负整数：^\d+$</p>
<p>2、正整数：^[0-9]*[1-9][0-9]*$</p>
<p>3、非正整数：^((-\d+)|(0+))$</p>
<p>4、负整数：^-[0-9]*[1-9][0-9]*$</p>
<p>5、整数：^-?\d+$</p>
<p>6、非负浮点数：^\d+(\.\d+)?$</p>
<p>7、正浮点数：^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$</p>
<p>8、非正浮点数：^((-\d+\.\d+)?)|(0+(\.0+)?))$</p>
<p>9、负浮点数：^(-((正浮点数正则式)))$</p>
<p>10、英文字符串：^[A-Za-z]+$</p>
<p>11、英文大写串：^[A-Z]+$</p>
<p>12、英文小写串：^[a-z]+$</p>
<p>13、英文字符数字串：^[A-Za-z0-9]+$</p>
<p>14、英数字加下划线串：^\w+$</p>
<p>15、E-mail地址：^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$</p>
<p>16、URL：^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$<br />
或：^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&amp;_~`@[\]\&#8217;:+!]*([^&lt;&gt;\"\"])*$</p>
<p>17、邮政编码：^[1-9]\d{5}$</p>
<p>18、中文：^[\u0391-\uFFE5]+$</p>
<p>19、电话号码：^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$</p>
<p>20、手机号码：^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$</p>
<p>21、双字节字符(包括汉字在内)：^\x00-\xff</p>
<p>22、匹配首尾空格：(^\s*)|(\s*$)（像vbscript那样的trim函数）</p>
<p>23、匹配HTML标记：&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;</p>
<p>24、匹配空行：\n[\s| ]*\r</p>
<p>25、提取信息中的网络链接：(h|H)(r|R)(e|E)(f|F) *= *(&#8216;|&#8221;)?(\w|\\|\/|\.)+(&#8216;|&#8221;| *|&gt;)?</p>
<p>26、提取信息中的邮件地址：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*</p>
<p>27、提取信息中的图片链接：(s|S)(r|R)(c|C) *= *(&#8216;|&#8221;)?(\w|\\|\/|\.)+(&#8216;|&#8221;| *|&gt;)?</p>
<p>28、提取信息中的IP地址：(\d+)\.(\d+)\.(\d+)\.(\d+)</p>
<p>29、提取信息中的中国手机号码：(86)*0*13\d{9}</p>
<p>30、提取信息中的中国固定电话号码：(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}</p>
<p>31、提取信息中的中国电话号码（包括移动和固定电话）：(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}</p>
<p>32、提取信息中的中国邮政编码：[1-9]{1}(\d+){5}</p>
<p>33、提取信息中的浮点数（即小数）：(-?\d*)\.?\d+</p>
<p>34、提取信息中的任何数字 ：(-?\d*)(\.\d+)?</p>
<p>35、IP：(\d+)\.(\d+)\.(\d+)\.(\d+)</p>
<p>36、电话区号：/^0\d{2,3}$/</p>
<p>37、腾讯QQ号：^[1-9]*[1-9][0-9]*$</p>
<p>38、帐号(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$</p>
<p>39、中文、英文、数字及下划线：^[\u4e00-\u9fa5_a-zA-Z0-9]+$</p>
]]></content:encoded>
			<wfw:commentRss>http://kuigg.com/changyong-zhengze/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>两个PHP冷门函数的简要使用</title>
		<link>http://kuigg.com/levenshtein-similar_text</link>
		<comments>http://kuigg.com/levenshtein-similar_text#comments</comments>
		<pubDate>Mon, 05 Jan 2009 20:08:03 +0000</pubDate>
		<dc:creator>kuiGG</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[学习资料]]></category>

		<guid isPermaLink="false">http://kuigg.com/?p=99</guid>
		<description><![CDATA[相信你在使用Google或者Baidu搜索的时候，肯定碰到过他们的关键词提示。
对于搜索引擎来说，他们有一整套分词技术及完整的词库。而对于一般简单的PHP应用来说，做到这种完善的分词又是很困难的。
其实php中有两个函数，可以近似的完成这样的功能。
这两个函数就是：levenshtein 和 similar_text
以下分别是这两个函数的官方解释：
http://www.php.net/manual/en/function.levenshtein.php
http://www.php.net/manual/en/function.similar-text.php
我们来简单看一下使用这两个函数的效果。
echo levenshtein(&#8220;ubuntu&#8221;,&#8221;ubuntw&#8221;);
&#160;&#160;&#160; echo &#8220;&#60;br&#62;&#8221;;
&#160;&#160;&#160; echo levenshtein(&#8220;ubuntu&#8221;,&#8221;aubvntu&#8221;);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; echo &#8220;&#60;br&#62;&#8221;;
&#160;&#160;&#160; echo levenshtein(&#8220;ubuntu&#8221;,&#8221;vbvntw&#8221;);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; echo &#8220;&#60;br&#62;&#8221;;
&#160;&#160;&#160; echo levenshtein(&#8220;ubuntu&#8221;,&#8221;ubuntu&#8221;);
这段代码的输出是：
1
2
3
0
也就是说，对于levenshtein函数，两个字符相似度越高，其返回值越小，如果相等，则函数返回0。
再来看看similar_text函数
similar_text(&#8220;ubuntu&#8221;,&#8221;ubuntw&#8221;,$a);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; echo $a;
&#160;&#160;&#160; echo &#8220;&#60;br&#62;&#8221;;
&#160;&#160;&#160;&#160; similar_text(&#8220;ubuntu&#8221;,&#8221;aubvntu&#8221;,$a);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; echo $a;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; echo &#8220;&#60;br&#62;&#8221;;
&#160;&#160;&#160;&#160; similar_text(&#8220;ubuntu&#8221;,&#8221;vbvntw&#8221;,$a);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; echo $a;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; echo &#8220;&#60;br&#62;&#8221;;
&#160;&#160;&#160;&#160; similar_text(&#8220;ubuntu&#8221;,&#8221;ubuntu&#8221;,$a);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; echo $a;
代码输出：
83.333333333333
76.923076923077
50
100
与levenshtein相反，similar_text则是相似度越高，其值越大，如果相等，则返回100。
了解了这两个函数的用法，我们可以通过这两个函数来达成类似最开始Google的那种效果了。当然还得有一些技术前提，
比如在某些CMS中，像DedeCMS，它本身维护了一个关键词的数据表，这样我们在每次搜索的时候，可以使用上面两个
函数对DedeCMS的关键词表进行逐一匹配，然后设定一个匹配限制，如果大于（小于）该值，则可以给出类似Google那样
的提示了。
&#160;
]]></description>
			<content:encoded><![CDATA[<p>相信你在使用Google或者Baidu搜索的时候，肯定碰到过他们的关键词提示。</p>
<p>对于搜索引擎来说，他们有一整套分词技术及完整的词库。而对于一般简单的PHP应用来说，做到这种完善的分词又是很困难的。<br />
其实php中有两个函数，可以近似的完成这样的功能。</p>
<p>这两个函数就是：levenshtein 和 similar_text<br />
以下分别是这两个函数的官方解释：<br />
<A href="http://www.php.net/manual/en/function.levenshtein.php">http://www.php.net/manual/en/function.levenshtein.php</A><br />
<A href="http://www.php.net/manual/en/function.similar-text.php">http://www.php.net/manual/en/function.similar-text.php</A></p>
<p>我们来简单看一下使用这两个函数的效果。</p>
<p>echo levenshtein(&#8220;ubuntu&#8221;,&#8221;ubuntw&#8221;);<br />
&nbsp;&nbsp;&nbsp; echo &#8220;&lt;br&gt;&#8221;;<br />
&nbsp;&nbsp;&nbsp; echo levenshtein(&#8220;ubuntu&#8221;,&#8221;aubvntu&#8221;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &#8220;&lt;br&gt;&#8221;;<br />
&nbsp;&nbsp;&nbsp; echo levenshtein(&#8220;ubuntu&#8221;,&#8221;vbvntw&#8221;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &#8220;&lt;br&gt;&#8221;;<br />
&nbsp;&nbsp;&nbsp; echo levenshtein(&#8220;ubuntu&#8221;,&#8221;ubuntu&#8221;);</p>
<p>这段代码的输出是：</p>
<p>1<br />
2<br />
3<br />
0</p>
<p>也就是说，对于levenshtein函数，两个字符相似度越高，其返回值越小，如果相等，则函数返回0。</p>
<p>再来看看similar_text函数</p>
<p>similar_text(&#8220;ubuntu&#8221;,&#8221;ubuntw&#8221;,$a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo $a;<br />
&nbsp;&nbsp;&nbsp; echo &#8220;&lt;br&gt;&#8221;;<br />
&nbsp;&nbsp;&nbsp;&nbsp; similar_text(&#8220;ubuntu&#8221;,&#8221;aubvntu&#8221;,$a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo $a;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &#8220;&lt;br&gt;&#8221;;<br />
&nbsp;&nbsp;&nbsp;&nbsp; similar_text(&#8220;ubuntu&#8221;,&#8221;vbvntw&#8221;,$a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo $a;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &#8220;&lt;br&gt;&#8221;;<br />
&nbsp;&nbsp;&nbsp;&nbsp; similar_text(&#8220;ubuntu&#8221;,&#8221;ubuntu&#8221;,$a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo $a;</p>
<p>代码输出：</p>
<p>83.333333333333<br />
76.923076923077<br />
50<br />
100</p>
<p>与levenshtein相反，similar_text则是相似度越高，其值越大，如果相等，则返回100。</p>
<p>了解了这两个函数的用法，我们可以通过这两个函数来达成类似最开始Google的那种效果了。当然还得有一些技术前提，<br />
比如在某些CMS中，像DedeCMS，它本身维护了一个关键词的数据表，这样我们在每次搜索的时候，可以使用上面两个<br />
函数对DedeCMS的关键词表进行逐一匹配，然后设定一个匹配限制，如果大于（小于）该值，则可以给出类似Google那样<br />
的提示了。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kuigg.com/levenshtein-similar_text/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP function : preg_match_all</title>
		<link>http://kuigg.com/preg_match_all</link>
		<comments>http://kuigg.com/preg_match_all#comments</comments>
		<pubDate>Wed, 24 Dec 2008 13:54:31 +0000</pubDate>
		<dc:creator>kuiGG</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[学习资料]]></category>

		<guid isPermaLink="false">http://kuigg.com/?p=92</guid>
		<description><![CDATA[&#60;?php
&#160;
/*
preg_match_all &#8211; Perform a global regular expression match.
int preg_match_all (string $pattern , string $subject , array &#38;$matches [ , int $flags [ , int $offset]])
Search $subject for all matches to the regular expression given in $pattern and put them in $matches in the order specified by $flags.
After the first match is found , the subsequent [...]]]></description>
			<content:encoded><![CDATA[<p>&lt;?php<br />
&nbsp;<br />
/*</p>
<p>preg_match_all &#8211; Perform a global regular expression match.</p>
<p>int preg_match_all (string $pattern , string $subject , array &amp;$matches [ , int $flags [ , int $offset]])<br />
Search $subject for all matches to the regular expression given in $pattern and put them in $matches in the order specified by $flags.<br />
After the first match is found , the subsequent searches are continue on from the end of the last match.</p>
<p>parameters:<br />
$pattern : The pattern to search for , as a string.<br />
$subject : The input string.<br />
$matches : Array of all matches in muti-dimensional array ordered according to $flags.<br />
$flags : Can be combination of following flags (note that it doesn&#8217;t make sense to use PREG_PATTERN_ORDER together with PREG_SET_ORDER):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PREG_PATTERN_ORDER: Orders result so that $matches[0] is an array of full pattern matches , $matches[1] is an array of strings matched by the first parenthesized subpattern , and so on.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If no order flag is given , PREG_PATTERN_ORDER is assummed.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PREG_SET_ORDER: Orders result so that $matches[0] is an array of first set of matches , $matches[1] is an array of second set of matches , and so on.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PREG_OFFSET_CAPTURE: If this flag is passed , for every occurring match the appendant string offset will also be returned. Note that this changes the value of $matches in an array where every element is an array consisting of the matched string at offset 0 and its string offset into $subject at offset 1.</p>
<p>$offset : Normally , the search start from the beginning of the $subject string. The optional parameter $offset can be used to specify the alternate place from which to start the search (in bytes).</p>
<p>return:<br />
Return the number of full pattern matches (which might be zero) , or FALSE if an erro occrred.</p>
<p>*/&nbsp;</p>
<p>&nbsp;</p>
<p>$str = &#8216;&lt;b&gt;yes&lt;/b&gt; &lt;strong&gt;no&lt;/strong&gt;&lt;br /&gt; &lt;a href=&#8221;<A href="http://kuigg.com/">http://kuigg.com</A>&#8220;&gt;&nbsp;kuigg &lt;/a&gt;&#8217;;<br />
$reg = &#8216;/&lt;\s*(\w+)[^&gt;]*&gt;(.*)&lt;\s*\/\s*\1\s*&gt;/&#8217;;<br />
preg_match_all ($reg , $str , $arr , PREG_SET_ORDER);<br />
var_dump ($arr);<br />
&nbsp;<br />
&nbsp;echo &#8216;&lt;br /&gt;<br />
&nbsp;&#8217;;<br />
&nbsp;<br />
preg_match_all ($reg , $str , $arr , PREG_PATTERN_ORDER);<br />
var_dump ($arr);</p>
<p>&nbsp;</p>
<p>?&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://kuigg.com/preg_match_all/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php正则表达式专题</title>
		<link>http://kuigg.com/php-zhengze</link>
		<comments>http://kuigg.com/php-zhengze#comments</comments>
		<pubDate>Sat, 23 Feb 2008 16:35:28 +0000</pubDate>
		<dc:creator>kuiGG</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[学习资料]]></category>

		<guid isPermaLink="false">http://kuigg.com/?p=79</guid>
		<description><![CDATA[一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。
这里有一些可能会遇到的正则表达式示例：
Visual Basic Scripting Edition
VBScript
匹配
/^\[ \t]*$/
&#8220;^\[ \t]*$&#8221;
匹配一个空白行。
/\d{2}-\d{5}/
&#8220;\d{2}-\d{5}&#8221;
验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。
/&#60;(.*)&#62;.*&#60;\/\1&#62;/
&#8220;&#60;(.*)&#62;.*&#60;\/\1&#62;&#8221;
匹配一个 HTML 标记。
下表是元字符及其在正则表达式上下文中的行为的一个完整列表：
字符
描述
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，&#8217;n&#8217; 匹配字符 &#8220;n&#8221;。&#8217;\n&#8217; 匹配一个换行符。序列 &#8216;\\&#8217; 匹配 &#8220;\&#8221; 而 &#8220;\(&#8221; 则匹配 &#8220;(&#8220;。
^
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之后的位置。
$
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之前的位置。
*
匹配前面的子表达式零次或多次。例如，zo* 能匹配 &#8220;z&#8221; 以及 &#8220;zoo&#8221;。 * 等价于{0,}。
+
匹配前面的子表达式一次或多次。例如，&#8217;zo+&#8217; 能匹配 &#8220;zo&#8221; 以及 &#8220;zoo&#8221;，但不能匹配 &#8220;z&#8221;。+ 等价于 {1,}。
?
匹配前面的子表达式零次或一次。例如，&#8221;do(es)?&#8221; 可以匹配 &#8220;do&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。<br />
这里有一些可能会遇到的正则表达式示例：<br />
Visual Basic Scripting Edition<br />
VBScript<br />
匹配<br />
/^\[ \t]*$/<br />
&#8220;^\[ \t]*$&#8221;<br />
匹配一个空白行。<br />
/\d{2}-\d{5}/<br />
&#8220;\d{2}-\d{5}&#8221;<br />
验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。<br />
/&lt;(.*)&gt;.*&lt;\/\1&gt;/<br />
&#8220;&lt;(.*)&gt;.*&lt;\/\1&gt;&#8221;<br />
匹配一个 HTML 标记。<br />
下表是元字符及其在正则表达式上下文中的行为的一个完整列表：<br />
字符<br />
描述<br />
\<br />
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，&#8217;n&#8217; 匹配字符 &#8220;n&#8221;。&#8217;\n&#8217; 匹配一个换行符。序列 &#8216;\\&#8217; 匹配 &#8220;\&#8221; 而 &#8220;\(&#8221; 则匹配 &#8220;(&#8220;。<br />
^<br />
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之后的位置。<br />
$<br />
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之前的位置。<br />
*<br />
匹配前面的子表达式零次或多次。例如，zo* 能匹配 &#8220;z&#8221; 以及 &#8220;zoo&#8221;。 * 等价于{0,}。<br />
+<br />
匹配前面的子表达式一次或多次。例如，&#8217;zo+&#8217; 能匹配 &#8220;zo&#8221; 以及 &#8220;zoo&#8221;，但不能匹配 &#8220;z&#8221;。+ 等价于 {1,}。<br />
?<br />
匹配前面的子表达式零次或一次。例如，&#8221;do(es)?&#8221; 可以匹配 &#8220;do&#8221; 或 &#8220;does&#8221; 中的&#8221;do&#8221; 。? 等价于 {0,1}。<br />
{n}<br />
n 是一个非负整数。匹配确定的 n 次。例如，&#8217;o{2}&#8217; 不能匹配 &#8220;Bob&#8221; 中的 &#8216;o&#8217;，但是能匹配 &#8220;food&#8221; 中的两个 o。<br />
{n,}<br />
n 是一个非负整数。至少匹配n 次。例如，&#8217;o{2,}&#8217; 不能匹配 &#8220;Bob&#8221; 中的 &#8216;o&#8217;，但能匹配 &#8220;foooood&#8221; 中的所有 o。&#8217;o{1,}&#8217; 等价于 &#8216;o+&#8217;。&#8217;o{0,}&#8217; 则等价于 &#8216;o*&#8217;。<br />
{n,m}<br />
m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。 &#8220;o{1,3}&#8221; 将匹配 &#8220;fooooood&#8221; 中的前三个 o。&#8217;o{0,1}&#8217; 等价于 &#8216;o?&#8217;。请注意在逗号和两个数之间不能有空格。<br />
?<br />
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 &#8220;oooo&#8221;，&#8217;o+?&#8217; 将匹配单个 &#8220;o&#8221;，而 &#8216;o+&#8217; 将匹配所有 &#8216;o&#8217;。<br />
.<br />
匹配除 &#8220;\n&#8221; 之外的任何单个字符。要匹配包括 &#8216;\n&#8217; 在内的任何字符，请使用象 &#8216;[.\n]&#8216; 的模式。<br />
(pattern)<br />
匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 &#8216;\(&#8216; 或 &#8216;\)&#8217;。<br />
(?:pattern)<br />
匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 &#8220;或&#8221; 字符 (|) 来组合一个模式的各个部分是很有用。例如， &#8216;industr(?:y|ies) 就是一个比 &#8216;industry|industries&#8217; 更简略的表达式。<br />
(?=pattern)<br />
正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如， &#8216;Windows (?=95|98|NT|2000)&#8217; 能匹配 &#8220;Windows 2000&#8243; 中的 &#8220;Windows&#8221; ，但不能匹配 &#8220;Windows 3.1&#8243; 中的 &#8220;Windows&#8221;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。<br />
(?!pattern)<br />
负向预查，在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如&#8217;Windows (?!95|98|NT|2000)&#8217; 能匹配 &#8220;Windows 3.1&#8243; 中的 &#8220;Windows&#8221;，但不能匹配 &#8220;Windows 2000&#8243; 中的 &#8220;Windows&#8221;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始<br />
x|y<br />
匹配 x 或 y。例如，&#8217;z|food&#8217; 能匹配 &#8220;z&#8221; 或 &#8220;food&#8221;。&#8217;(z|f)ood&#8217; 则匹配 &#8220;zood&#8221; 或 &#8220;food&#8221;。<br />
[[I]xyz[/I]]<br />
字符集合。匹配所包含的任意一个字符。例如， &#8216;[abc]&#8216; 可以匹配 &#8220;plain&#8221; 中的 &#8216;a&#8217;。<br />
[^[I]xyz[/I]]<br />
负值字符集合。匹配未包含的任意字符。例如， &#8216;[^abc]&#8216; 可以匹配 &#8220;plain&#8221; 中的&#8217;p'。<br />
[[I]a-z[/I]]<br />
字符范围。匹配指定范围内的任意字符。例如，&#8217;[a-z]&#8216; 可以匹配 &#8216;a&#8217; 到 &#8216;z&#8217; 范围内的任意小写字母字符。<br />
[^[I]a-z[/I]]<br />
负值字符范围。匹配任何不在指定范围内的任意字符。例如，&#8217;[^a-z]&#8216; 可以匹配任何不在 &#8216;a&#8217; 到 &#8216;z&#8217; 范围内的任意字符。<br />
\b<br />
匹配一个单词边界，也就是指单词和空格间的位置。例如， &#8216;er\b&#8217; 可以匹配&#8221;never&#8221; 中的 &#8216;er&#8217;，但不能匹配 &#8220;verb&#8221; 中的 &#8216;er&#8217;。<br />
\B<br />
匹配非单词边界。&#8217;er\B&#8217; 能匹配 &#8220;verb&#8221; 中的 &#8216;er&#8217;，但不能匹配 &#8220;never&#8221; 中的 &#8216;er&#8217;。<br />
\cx<br />
匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 &#8216;c&#8217; 字符。<br />
\d<br />
匹配一个数字字符。等价于 [0-9]。<br />
\D<br />
匹配一个非数字字符。等价于 [^0-9]。<br />
\f<br />
匹配一个换页符。等价于 \x0c 和 \cL。<br />
\n<br />
匹配一个换行符。等价于 \x0a 和 \cJ。<br />
\r<br />
匹配一个回车符。等价于 \x0d 和 \cM。<br />
\s<br />
匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。<br />
\S<br />
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。<br />
\t<br />
匹配一个制表符。等价于 \x09 和 \cI。<br />
\v<br />
匹配一个垂直制表符。等价于 \x0b 和 \cK。<br />
\w<br />
匹配包括下划线的任何单词字符。等价于&#8217;[A-Za-z0-9_]&#8216;。<br />
\W<br />
匹配任何非单词字符。等价于 &#8216;[^A-Za-z0-9_]&#8216;。<br />
\xn<br />
匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， &#8216;\x41&#8242; 匹配 &#8220;A&#8221;。&#8217;\x041&#8242; 则等价于 &#8216;\x04&#8242; &amp; &#8220;1&#8243;。正则表达式中可以使用 ASCII 编码。.<br />
\num<br />
匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，&#8217;(.)\1&#8242; 匹配两个连续的相同字符。<br />
\n<br />
标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。<br />
\nm<br />
标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm 为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若&nbsp; n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。<br />
\nml<br />
如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。<br />
\un<br />
匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</p>
]]></content:encoded>
			<wfw:commentRss>http://kuigg.com/php-zhengze/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>优化PHP代码的40条建议</title>
		<link>http://kuigg.com/php-youhua</link>
		<comments>http://kuigg.com/php-youhua#comments</comments>
		<pubDate>Sat, 23 Feb 2008 16:27:43 +0000</pubDate>
		<dc:creator>kuiGG</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[学习资料]]></category>

		<guid isPermaLink="false">http://kuigg.com/?p=78</guid>
		<description><![CDATA[优化PHP代码的40条建议
40 Tips for optimizing your php Code
原文地址：http://reinholdweber.com/?p=3
英文版权归Reinhold Weber所有，中译文作者yangyang（aka davidkoree）。双语版可用于非商业传播，但须注明英文版作者、版权信息，以及中译文作者。翻译水平有限，请广大PHPer指正。
1.&#160;&#160;&#160; If a method can be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化，就对它做静态声明。速率可提升至4倍。
2.&#160;&#160;&#160; echo is faster than print. echo 比 print 快。
3.&#160;&#160;&#160; Use echo’s multiple parameters instead of string concatenation. 使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接。
4.&#160;&#160;&#160; Set the maxvalue for your for-loops before and not in [...]]]></description>
			<content:encoded><![CDATA[<p>优化PHP代码的40条建议</p>
<p>40 Tips for optimizing your php Code</p>
<p>原文地址：<A href="http://reinholdweber.com/?p=3">http://reinholdweber.com/?p=3</A></p>
<p>英文版权归Reinhold Weber所有，中译文作者yangyang（aka davidkoree）。双语版可用于非商业传播，但须注明英文版作者、版权信息，以及中译文作者。翻译水平有限，请广大PHPer指正。</p>
<p>1.&nbsp;&nbsp;&nbsp; If a method can be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化，就对它做静态声明。速率可提升至4倍。</p>
<p>2.&nbsp;&nbsp;&nbsp; echo is faster than print. echo 比 print 快。</p>
<p>3.&nbsp;&nbsp;&nbsp; Use echo’s multiple parameters instead of string concatenation. 使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接。</p>
<p>4.&nbsp;&nbsp;&nbsp; Set the maxvalue for your for-loops before and not in the loop. 在执行for循环之前确定最大循环数，不要每循环一次都计算最大值。</p>
<p>5.&nbsp;&nbsp;&nbsp; Unset your variables to free memory, especially large arrays. 注销那些不用的变量尤其是大数组，以便释放内存。</p>
<p>6.&nbsp;&nbsp;&nbsp; Avoid magic like __get, __set, __autoload 尽量避免使用__get，__set，__autoload。</p>
<p>7.&nbsp;&nbsp;&nbsp; require_once() is expensive require_once()代价昂贵。</p>
<p>8.&nbsp;&nbsp;&nbsp; Use full paths in includes and requires, less time spent on resolving the OS paths. 在包含文件时使用完整路径，解析操作系统路径所需的时间会更少。</p>
<p>9.&nbsp;&nbsp;&nbsp; If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time() 如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。</p>
<p>10.&nbsp;&nbsp;&nbsp; See if you can use strncasecmp, strpbrk and stripos instead of regex. 检查是否能用strncasecmp，strpbrk，stripos函数代替正则表达式完成相同功能。</p>
<p>11.&nbsp;&nbsp;&nbsp; str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4. str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。</p>
<p>12.&nbsp;&nbsp;&nbsp; If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments. 如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。</p>
<p>13.&nbsp;&nbsp;&nbsp; It’s better to use select statements than multi if, else if, statements. 使用选择分支语句（译注：即switch case）好于使用多个if，else if语句。</p>
<p>14.&nbsp;&nbsp;&nbsp; Error suppression with @ is very slow. 用@屏蔽错误消息的做法非常低效。</p>
<p>15.&nbsp;&nbsp;&nbsp; Turn on apache’s mod_deflate 打开apache的mod_deflate模块。</p>
<p>16.&nbsp;&nbsp;&nbsp; Close your database connections when you’re done with them. 数据库连接当使用完毕时应关掉。</p>
<p>17.&nbsp;&nbsp;&nbsp; $row[’id’] is 7 times faster than $row[id]. $row[‘id’]的效率是$row[id]的7倍。</p>
<p>18.&nbsp;&nbsp;&nbsp; Error messages are expensive. 错误消息代价昂贵。</p>
<p>19.&nbsp;&nbsp;&nbsp; Do not use functions inside of for loop, such as for ($x=0; $x &lt; count($array); $x) The count() function gets called each time. 尽量不要在for循环中使用函数，比如for ($x=0; $x &lt; count($array); $x)每循环一次都会调用count()函数。</p>
<p>20.&nbsp;&nbsp;&nbsp; Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function. 在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。</p>
<p>21.&nbsp;&nbsp;&nbsp; Incrementing a global variable is 2 times slow than a local var. 递增一个全局变量要比递增一个局部变量慢2倍。</p>
<p>22.&nbsp;&nbsp;&nbsp; Incrementing an object property (eg. $this-&gt;prop++) is 3 times slower than a local variable. 递增一个对象属性（如：$this-&gt;prop++）要比递增一个局部变量慢3倍。</p>
<p>23.&nbsp;&nbsp;&nbsp; Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one. 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p>
<p>24.&nbsp;&nbsp;&nbsp; Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists. 仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。</p>
<p>25.&nbsp;&nbsp;&nbsp; Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance. 方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。</p>
<p>26.&nbsp;&nbsp;&nbsp; Methods in derived classes run faster than ones defined in the base class. 派生类中的方法运行起来要快于在基类中定义的同样的方法。</p>
<p>27.&nbsp;&nbsp;&nbsp; A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations. 调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。</p>
<p>28.&nbsp;&nbsp;&nbsp; Surrounding your string by ‘ instead of &#8221; will make things interpret a little faster since php looks for variables inside &#8220;…&#8221; but not inside ‘…’. Of course you can only do this when you don’t need to have variables in the string. 用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会。当然，只有当你不需要在字符串中包含变量时才可以这么做。</p>
<p>29.&nbsp;&nbsp;&nbsp; When echoing strings it’s faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments. 输出多个字符串时，用逗号代替句点来分隔字符串，速度更快。注意：只有echo能这么做，它是一种可以把多个字符串当作参数的“函数”（译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号）。</p>
<p>30.&nbsp;&nbsp;&nbsp; A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts. Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。</p>
<p>31.&nbsp;&nbsp;&nbsp; Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times. 除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。</p>
<p>32.&nbsp;&nbsp;&nbsp; Cache as much as possible. Use memcached &#8211; memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request. 尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码(OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。</p>
<p>33.&nbsp;&nbsp;&nbsp; When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function. This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase &amp; hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick. 当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset()技巧加速执行你的代码。</p>
<p>Ex.（举例如下）</p>
<p>if (strlen($foo) &lt; 5) { echo &#8220;Foo is too short&#8221;; }</p>
<p>vs.（与下面的技巧做比较）</p>
<p>if (!isset($foo{5})) { echo &#8220;Foo is too short&#8221;; }</p>
<p>Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it’s execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string’s length. 调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。</p>
<p>34.&nbsp;&nbsp;&nbsp; When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend’s PHP optimizer. It is still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer. 当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种，正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商（ISPs）和服务器。</p>
<p>35.&nbsp;&nbsp;&nbsp; Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory. 并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。</p>
<p>36.&nbsp;&nbsp;&nbsp; Do not implement every data structure as a class, arrays are useful, too. 并非要用类实现所有的数据结构，数组也很有用。</p>
<p>37.&nbsp;&nbsp;&nbsp; Don’t split methods too much, think, which code you will really re-use. 不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码？</p>
<p>38.&nbsp;&nbsp;&nbsp; You can always split the code of a method later, when needed. 当你需要时，你总能把代码分解成方法。</p>
<p>39.&nbsp;&nbsp;&nbsp; Make use of the countless predefined functions. 尽量采用大量的PHP内置函数。</p>
<p>40.&nbsp;&nbsp;&nbsp; If you have very time consuming functions in your code, consider writing them as C extensions. 如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。</p>
<p>41.&nbsp;&nbsp;&nbsp; Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview. 评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。</p>
<p>42.&nbsp;&nbsp;&nbsp; mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%. mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://kuigg.com/php-youhua/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP初学者头痛的十四个问题</title>
		<link>http://kuigg.com/php-chuxuezhe-40</link>
		<comments>http://kuigg.com/php-chuxuezhe-40#comments</comments>
		<pubDate>Thu, 27 Sep 2007 10:18:51 +0000</pubDate>
		<dc:creator>kuiGG</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[学习资料]]></category>

		<guid isPermaLink="false">http://kuigg.com/?p=71</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160; 【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的，所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到。当然也可以修改自动全局变量为开(php.ini改为register_globals = On)；考虑到兼容性，还是强迫自己熟悉新的写法比较好。 
　　【2】Win32下apache2 用get方法传递中文参数会出错：
　　test.php?a=你好&#38;b=你也好 
　　传递参数是会导致一个内部错误
　
　　解决办法:&#8221;test.php?a=&#8221;.urlencode(你好).&#8221;&#38;b=&#8221;.urlencode(你也好) 
　　 &#8230;&#8230;&#8230;&#8230;. 
　　【3】win32下的session不能正常工作 
　　php.ini默认的session.save_path = /tmp 
　　这显然是linux下的配置，win32下php无法读写session文件导致session无法使用，把它改成一个绝对路径就可以了，例如session.save_path = c:windows emp 
　　【4】显示错误信息 
　　当php.ini的display_errors = On并且error_reporting = E_ALL时，将显示所有的错误和提示，调试的时候最好打开以便纠错，如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示，解决办法是探测或者屏蔽。
　　例如显示$foo，可以if(isset($foo)) echo $foo 或者echo @$foo 
　　【5】Win32下mail()不能发送电子邮件 
　　在linux下配置好的sendmail可以发送，在win32下需要调用smtp服务器来发送电子邮件，修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到) 
　　php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器。
　　【6】初装的mysql如果没有设置密码，应该使用update mysql.user set password=&#8221;yourpassword&#8221; where user=&#8221;root&#8221; 修改密码
　　【7】header already sent 
　　这个错误通常会在你使用HEADER的时候出现，他可能是几种原因：1，你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。！ 
　　【8】更改php.ini后没有变化 
　　重新启动web server，比如IIS，Apache等等，然后才会应用最新的设置。
　　【9】php在2003上面安装（ISAPI的安装方法恳请高手指教） 
　　PHP4的php4isapi.dll好像和2003有些冲突，只能用CGI模式安装 
　　步骤一，先www.php.net 下在一个安装程序，我是装的是：php-4.2.3-installer.exe，你也可以去找最新的版本，在安装php-4.2.3-installer.exe之前保证你的IIS6.0启动了，并能够访问。安装好以后，在默认网站&#8211;＞应用程序配置。
　　步骤二：点击 web服务扩展 &#8211;＞新建web服务扩展。
　　步骤三： 扩展名&#8211;＞php,然后添加 
　　步骤四：找到php.exe的路径添加上去。 
　　步骤五： 确定就可以了！
　
　　步骤六： [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的，所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到。当然也可以修改自动全局变量为开(php.ini改为register_globals = On)；考虑到兼容性，还是强迫自己熟悉新的写法比较好。 </p>
<p>　　【2】Win32下apache2 用get方法传递中文参数会出错：</p>
<p>　　test.php?a=你好&amp;b=你也好 </p>
<p>　　传递参数是会导致一个内部错误<br />
　<br />
　　解决办法:&#8221;test.php?a=&#8221;.urlencode(你好).&#8221;&amp;b=&#8221;.urlencode(你也好) </p>
<p>　　 &#8230;&#8230;&#8230;&#8230;. </p>
<p>　　【3】win32下的session不能正常工作 </p>
<p>　　php.ini默认的session.save_path = /tmp </p>
<p>　　这显然是linux下的配置，win32下php无法读写session文件导致session无法使用，把它改成一个绝对路径就可以了，例如session.save_path = c:windows emp </p>
<p>　　【4】显示错误信息 </p>
<p>　　当php.ini的display_errors = On并且error_reporting = E_ALL时，将显示所有的错误和提示，调试的时候最好打开以便纠错，如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示，解决办法是探测或者屏蔽。</p>
<p>　　例如显示$foo，可以if(isset($foo)) echo $foo 或者echo @$foo </p>
<p>　　【5】Win32下mail()不能发送电子邮件 </p>
<p>　　在linux下配置好的sendmail可以发送，在win32下需要调用smtp服务器来发送电子邮件，修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到) </p>
<p>　　php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器。</p>
<p>　　【6】初装的mysql如果没有设置密码，应该使用update mysql.user set password=&#8221;yourpassword&#8221; where user=&#8221;root&#8221; 修改密码</p>
<p>　　【7】header already sent </p>
<p>　　这个错误通常会在你使用HEADER的时候出现，他可能是几种原因：1，你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。！ </p>
<p>　　【8】更改php.ini后没有变化 </p>
<p>　　重新启动web server，比如IIS，Apache等等，然后才会应用最新的设置。</p>
<p>　　【9】php在2003上面安装（ISAPI的安装方法恳请高手指教） </p>
<p>　　PHP4的php4isapi.dll好像和2003有些冲突，只能用CGI模式安装 </p>
<p>　　步骤一，先www.php.net 下在一个安装程序，我是装的是：php-4.2.3-installer.exe，你也可以去找最新的版本，在安装php-4.2.3-installer.exe之前保证你的IIS6.0启动了，并能够访问。安装好以后，在默认网站&#8211;＞应用程序配置。</p>
<p>　　步骤二：点击 web服务扩展 &#8211;＞新建web服务扩展。</p>
<p>　　步骤三： 扩展名&#8211;＞php,然后添加 </p>
<p>　　步骤四：找到php.exe的路径添加上去。 </p>
<p>　　步骤五： 确定就可以了！<br />
　<br />
　　步骤六： 选择php的服务扩展，然后点击允许。 </p>
<p>　　【10】有时候sql语句不起作用，对数据库操作失败，最简便的调试方法，echo那句sql，看看变量的值能得到不。</p>
<p>　　【11】include和require的区别 </p>
<p>　　两者没有太大的区别，如果要包含的文件不存在，include提示notice，然后继续执行下面的语句，require提示致命错误并且退出。</p>
<p>　　据我测试，win32平台下它们都是先包含后执行，所以被包含文件里最好不要再有include或require语句，这样会造成目录混乱。或许*nux下情况不同，暂时还没测试。</p>
<p>　　如果一个文件不想被包含多次可以使用include_once或require_once## 读取，写入文档数据。</p>
<p> function r($file_name) {<br />
　$filenum=@fopen($file_name,&#8221;r&#8221;);<br />
　@flock($filenum,LOCK_SH);<br />
　$file_data=@fread($filenum,filesize($file_name));<br />
　@fclose($filenum);<br />
　return $file_data;<br />
}<br />
function w($file_name,$data,$method=&#8221;w&#8221;){<br />
　$filenum=@fopen($file_name,$method);<br />
　flock($filenum,LOCK_EX);<br />
　$file_data=fwrite($filenum,$data);<br />
　fclose($filenum);<br />
　return $file_data;<br />
} </p>
<p>　　【12】isset()和empty()的区别 </p>
<p>　　两者都是测试变量用的，但是isset()是测试变量是否被赋值，而empty()是测试一个已经被赋值的变量是否为空。</p>
<p>　　如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示，如果一个变量被赋空值，$foo=&#8221;"或者$foo=0或者 $foo=false,那么empty($foo)返回真，isset($foo)也返回真，就是说赋空值不会注销一个变量。<br />
　<br />
　　要注销一个变量，可以用 unset($foo)或者$foo=NULL </p>
<p>　　【13】mysql查询语句包含有关键字 </p>
<p>　　php查询mysql的时候，有时候mysql表名或者列名会有关键字，这时候查询会有错误。例如表名是order,查询时候会出错，简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别，例如select * from `order` </p>
<p>　　【14】通过HTTP协议一次上传多个文件的方法 </p>
<p>　　有两个思路，是同一个方法的两种实现。具体程序还需自己去设计。</p>
<p>　　1、在form中设置多个文件输入框，用数组命名他们的名字，如下： </p>
<p> ＜form action=&#8221;" method=post＞<br />
＜input type=file name=usefile[]＞<br />
＜input type=file name=usefile[]＞<br />
＜input type=file name=usefile[]＞<br />
＜/form＞ </p>
<p>　　这样，在服务器端做以下测试：</p>
<p> echo &#8220;＜pre＞&#8221;;<br />
print_r($_FILES);<br />
echo &#8220;＜/pre＞&#8221;; </p>
<p>　　2、在form中设置多个文件输入框，但名字不同，如下： </p>
<p> ＜form action=&#8221;" method=post＞<br />
＜input type=file name=usefile_a＞<br />
＜input type=file name=usefile_b＞<br />
＜input type=file name=usefile_c＞<br />
＜/form＞ </p>
<p>　　在服务器端做同样测试： </p>
<p> echo &#8220;＜pre＞&#8221;;<br />
print_r($_FILES);<br />
echo &#8220;＜/pre＞&#8221;;</p>
]]></content:encoded>
			<wfw:commentRss>http://kuigg.com/php-chuxuezhe-40/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于set_magic_quotes_runtime()</title>
		<link>http://kuigg.com/set_magic_quotes_runtime</link>
		<comments>http://kuigg.com/set_magic_quotes_runtime#comments</comments>
		<pubDate>Sun, 22 Apr 2007 15:01:06 +0000</pubDate>
		<dc:creator>kuiGG</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[学习资料]]></category>

		<guid isPermaLink="false">http://kuigg.com/?p=22</guid>
		<description><![CDATA[&#160;先来了解一下 magic_quotes_runtime&#160;&#160;这是php.ini里面的环境配置变量，可以直接在php.ini里面设置为ON，那么PHP将会为所有的溢出字符，当遇到反斜杆、单引号，将会自动加上一个反斜杆，保护系统和数据库的安全。
那么 set_magic_quotes_runtime()&#160;&#160;就是在php.ini没有配置的情况下，一个设置的开关 0 为关闭 1为打开，就等于用程序手动打开 magic_quotes_runtime 。 
]]></description>
			<content:encoded><![CDATA[<p>&nbsp;先来了解一下 magic_quotes_runtime&nbsp;&nbsp;这是php.ini里面的环境配置变量，可以直接在php.ini里面设置为ON，那么PHP将会为所有的溢出字符，当遇到反斜杆、单引号，将会自动加上一个反斜杆，保护系统和数据库的安全。</p>
<p>那么 set_magic_quotes_runtime()&nbsp;&nbsp;就是在php.ini没有配置的情况下，一个设置的开关 0 为关闭 1为打开，就等于用程序手动打开 magic_quotes_runtime 。 </p>
]]></content:encoded>
			<wfw:commentRss>http://kuigg.com/set_magic_quotes_runtime/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
