2012-1-30 17:22 Monday  

PHP中正则表达式详细说明

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

正则表达式中的特殊字符

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

2012-1-30 17:20 Monday  

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

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

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

2012-1-30 17:19 Monday  

1.Date
属性(1):
constructor      所建立对象的函数参考
prototype       能够为对象加入的属性和方法

方法(43):
getDay()        返回一周中的第几天(0-6)
getYear()       返回年份.2000年以前为2位,2000(包含)以后为4位
getFullYear()     返回完整的4位年份数
getMonth()      返回月份数(0-11)
getDate()       返回日(1-31)
getHours()       返回小时数(0-23)
getMinutes()      返回分钟(0-59)
getSeconds()      返回秒数(0-59)
getMilliseconds() 返回毫秒(0-999)
getUTCDay()      依据国际时间来得到现在是星期几(0-6)
getUTCFullYear()    依据国际时间来得到完整的年份
getUTCMonth()     依据国际时间来得到月份(0-11)
getUTCDate()      依据国际时间来得到日(1-31)
getUTCHours()     依据国际时间来得到小时(0-23)
getUTCMinutes()    依据国际时间来返回分钟(0-59)
getUTCSeconds()    依据国际时间来返回秒(0-59)
getUTCMilliseconds()依据国际时间来返回毫秒(0-999)
getTime()       返回从1970年1月1号0:0:0到现在一共花去的毫秒数
getTimezoneoffset() 返回时区偏差值,即格林威治平均时间(GMT)与运行脚本的计算机所处时区设置之间相差的分钟数)
parse(dateString)   返回在Date字符串中自从1970年1月1日00:00:00以来的毫秒数
setYear(yearInt)    设置年份.2位数或4位数
setFullYear(yearInt)设置年份.4位数
setMonth(monthInt) 设置月份(0-11)
setDate(dateInt)    设置日(1-31)
setHours(hourInt) 设置小时数(0-23)
setMinutes(minInt) 设置分钟数(0-59)
setSeconds(secInt) 设置秒数(0-59)
setMilliseconds(milliInt) 设置毫秒(0-999)
setUTCFullYear(yearInt) 依据国际时间来设置年份
setUTCMonth(monthInt) 依据国际时间来设置月(0-11)
setUTCDate(dateInt)     依据国际时间来设置日(1-31)
setUTCHours(hourInt)    依据国际时间来设置小时
setUTCMinutes(minInt) 依据国际时间来设置分钟
setUTCSeconds(secInt)    依据国际时间来设置秒
setUTCMilliseconds(milliInt)依据国际时间来设置毫秒
setTime(timeInt)    设置从1970年1月1日开始的时间.毫秒数
toGMTString()     根据格林威治时间将Date对象的日期(一个数值)转变成一个GMT时间字符串,如:Weds,15 June l997 14:02:02 GMT
toUTCString()     根据通用时间将一个Date对象的日期转换为一个字符串
toLocaleString()    把Date对象的日期(一个数值)转变成一个字符串,使用所在计算机上配置使用的特定日期格式
toSource()       显示对象的源代码
toString()       将日期对象转换为字符串
UTC(yyyy, mm, dd, hh, mm, ss, msec)返回从格林威治标准时间到指定时间的差距,单位为毫秒
valueOf()       返回日期对象的原始值

2.Math
属性:
constructor      所建立对象的函数参考
prototype       能够为对象加入的属性和方法
E           欧拉常量,自然对数的底(约等于2.718)
LN2          2的自然对数(约等于0.693)
LN10          10的自然对数(约等于2.302)
LOG2E         以2为底的e的对数.(约等于1.442)
LOG10E         以10为底的e的对数(约等于0.434)
PI           ∏的值(约等于3.14159)
SQRT1_2        1/2(0.5)的平方根(即l除以2的平方根,约等于o.707)
SQRT2         2的平方根(约等于1.414)

方法:
abs(x)     返回数字的绝对值
acos(x)    返回数字的反余弦值
asin(x)    返回数字的反正弦值
atan(x)    返回位于-PI/2 和 PI/2 的反正切值
atan2(y,x) 返回(x,y)位于 -PI 到 PI 之间的角度
ceil(x)    返回 x 四舍五入后的最大整数
cos(x)     返回一个数字的余弦值
exp(x)     返回 E^x 值
floor(x)    返回 x 四舍五入后的最小整数
log(x)     返回底数为E的自然对数
max(x,y)    返回 x 和 y 之间较大的数
min(x,y)    返回 x 和 y 之间较小的数
pow(x,y)    返回 y^x 的值
random()    返回位于 0 到 1 之间的随机函数
round(x)    四舍五入后取整
sin(x)     返回数字的正弦值
sqrt(x)    返回数字的平方根
tan(x)     返回一个角度的正切值
toSource() 显示对象的源代码
valueOf() 返回数学对象的原始值

3.Number
属性:
MAX_VALUE       The largest possible value a number in JavaScript can have 1.7976931348623157E+308
MIN_VALUE       The smallest possible value a number in JavaScript can have 5E-324
NaN          Equal to a value that is not a number.
NEGATIVE_INFINITY A value that is less than MIN_VALUE.
POSOTIVE_INFINITY A value that is greater than MAX_VALUE.
prototype       A static property of the Number object

方法:
toString       Returns a string representing the specified object
valueOf()      返回数学对象的原始值

4.Boolean
属性:
constructor 所建立对象的函数参考
prototype    能够为对象加入的属性和方法

方法:
toSource()    显示对象的源代码
toString()    将布尔值转换为字符串,并且返回结果
valueOf()    返回布尔对象的原始值


5.String
属性:
constructor 所建立对象的函数参考
prototype    能够为对象加入的属性和方法
length      返回字符串的字符长度

方法(20):
anchor("name")用来把字符串转换为HTML锚点标记内(<A NAME=>)
big()      把字符串中的文本变成大字体(<BIG>)
blink()     把字符串中的文本变成闪烁字体(<BLINK>)
bold()      把字符串中的文本变成黑字体(<B>)
fixed()     把字符串中的文本变成固定间距字体,即电报形式(<TT>)
fontcolor(color)设置字符串中文本的颜色(<FONT COLOR=>)
Fontsize(size) 把字符串中的文本变成指定大小(<FONTSIZE=>)
italics()    把字符串中的文本变成斜字体(<I>)
Link(url)用来把字符串转换-HTML链接标记中(<A HREF=>)
small()     把字符串中的文本变成小字体(<SMALL>)
strike()     把字符串中的文本变成划掉字体(<STRIKE>)
sub()      把字符串中的文本变成下标(subscript)字体((SUB>)
sup()      把字符串中的文本变成上标(superscript)字体(<SUP>)

charAt(index) 返回指定索引处的字符
charCodeAt(index)返回一个整数,该整数表示String对象中指定位置处的字符的Unicode编码
concat(string2)连接两条或多条字符串
fromCharCode(num1, num2, …, numN)获取指定的Unicode值并返回字符串
indexOf(searchString, startIndex) 返回字符串中第一个出现指定字符串的位置
lastlndexOf(searchString, startIndex) 返回字符串中最后一个出现指定字符串的位置
match(regex) 在字符串中查找指定值
replace(regex, newString)将字符串中的某些字符替换成其它字符
search(regex) 针对某执行值对字符串进行查找
slice(startIndex, endIndex)将部分字符抽出并在新的字符串中返回剩余部分
split(delimiter)将字符串分配为数组
substr(startIndex, length) 从startIndex取,取length个字符
substring(startIndex, endIndex) 从startIndex和endIndex之间的字符,不包括endIndex

toLowerCase() 把字符串中的文本变成小写
toUpperCase() 把字符串中的文本变成大写
toSource()    显示对象的源代码
valueOf()    返回字符串对象的原始值

6.Array
属性:
constructor 所建立对象的函数参考
prototype    能够为对象加入的属性和方法
index      For an array created by a regular expression match, the zero-based index of the match in the string.
input      For an array created by a regular expression match, reflects the original string against which the regular expression was matched.
length      获取数组元素的个数,即最大下标加1

方法(13):
concat(array1,arrayn)将两个或两个以上的数组值连接起来,合并后返回结果
join(string) 将数组中元素合并为字符串,string为分隔符.如省略参数则直接合并,不再分隔
pop()      移除数组中的最后一个元素并返回该元素
push(value) 在数组的末尾加上一个或多个元素,并且返回新的数组长度值
reverse()    颠倒数组中元素的顺序,反向排列
shift()     移除数组中的第一个元素并返回该元素
slice(start, deleteCount, [item1[, item2[,...[,itemN]]]]) 返从一个数组中移除一个或多个元素,如果必要,在所移除元素的位置上插入新元素,返回所移除的元素
sort(compare Function) 在未指定排序号的情况下,按照元素的字母顺序排列,如果不是字符串类型则转换成字符串再排序,返回排序后的数组
splice()     为数组删除并添加新的元素
toSource()    显示对象的源代码
toString()    将数组所有元素返回一个字符串,其间用逗号分隔
unshift(value)为数组的开始部分加上一个或多个元素,并且返回该数组的新长度
valueOf()    返回数组对象的原始值

7.RegExp
属性:
$1, ..., $9 Parenthesized substring matches, if any.
$_        See input.
$*        See multiline.
$&        See lastMatch.
$+        See lastParen.
$`        See leftContext.
$'        See rightContext.
global      Whether or not to test the regular expression against all possible matches in a string, or only against the first.
ignoreCase    Whether or not to ignore case while attempting a match in a string.
input      The string against which a regular expression is matched.
lastIndex    The index at which to start the next match.
lastMatch    The last matched characters.
lastParen    The last parenthesized substring match, if any.
leftContext The substring preceding the most recent match.
multiline    Whether or not to search in strings across multiple lines.
rightContext The substring following the most recent match.
source      The text of the pattern.

方法:
compile     Compiles a regular expression object.
exec       Executes a search for a match in its string parameter.
test       Tests for a match in its string parameter

8.Function
属性:
arguments    An array corresponding to the arguments passed to a function.
arity      Indicates the number of arguments expected by the function.
caller      Specifies which function called the current function.
prototype    Allows the addition of properties to a Function object.

方法:
toString     Returns a string representing the specified object.

9.Object
属性:
constructor Specifies the function that creates an object's prototype.
prototype    Allows the addition of properties to all objects.

方法:
eval       Evaluates a string of JavaScript code in the context of the specified object.
toString     Returns a string representing the specified object.
unwatch     Removes a watchpoint from a 属性源 the object.
valueOf     Returns the primitive value of the specified object.
watch      Adds a watchpoint to a 属性源 the object.

10.全局
属性:
Infinity     指定一个正负无穷大的数值
NaN       指定一个 “非数字” 值
undefined    指定一个未被赋值的变量

方法:
decodeURI()       为加密的URI进行解码
decodeURIComponent() 为加密的URI组件解码
encodeURI()       将字符串加密为URI
encodeURIComponent() 将字符串加密为URI组件
escape(string)      加密一个字符串
unescape()        使用escape()对一个字符串进行解码
eval(string)       判断一个字符串并将其以脚本代码的形式执行
isFinite(number)     检测一个值是否为一个有限数字,返回True或False
isNaN(string)      检测一个值是否不是一个有限数字
Number()         将一个对象的值转换为一个数字
parseFloat(string)    将一个字符串解析为一个浮点数字
parseInt(string)     将一个字符串解析为一个整数,不是四舍五入操作,而是切尾
String(object)      将一个对象值转换为一个字符串
number(object)

11.事件
属性:
a.窗口事件,只在body和frameset元素中才有效
onload      页面或图片加载完成时
onunload     用户离开页面时

b.表单元素事件,在表单元素中才有效
onchange     框内容改变时
onsubmit     点击提交按钮时
onreset     重新点击鼠标按键时
onselect     文本被选择时
onblur      元素失去焦点时
onfocus     当元素获取焦点时

c.键盘事件,在base,bdo,br,frame,frameset,head,html,iframe,meta,param,script,style,title元素里都无效
onkeydown    按下键盘按键时
onkeypress    按下或按住键盘按键时
onkeyup     放开键盘按键时

d.在base,bdo,br,frame,frameset,head,html,iframe,meta,param,script,style,title元素里都无效
onclick     鼠标点击一个对象时
ondblclick    鼠标双击一个对象时
onmousedown 鼠标被按下时
onmousemove 鼠标被移动时
onmouseout    鼠标离开元素时
onmouseover 鼠标经过元素时
onmouseup    释放鼠标按键时

e.其他
onresize     当窗口或框架被重新定义尺寸时
onabort     图片下载被打断时
onerror     当加载文档或图片时发生错误时


自定义对象:有初始化对象和定义构造函数的对象两种方法
a:初始化对象
例如: 对象={属性1:值1;属性2:值2;......属性n:值n} 注意:每个属性/值对之间用分号隔开;

b: 定义构造函数的对象
例如:
function 函数名(属性1, 属性2,......属性N){
this.属性1=属性值1;
this.属性2=属性值2;
this.属性n=属性值n;

this.方法名1=函数名1;
this.方法名2=函数名2;
}

注意:方法名和函数名可以同名,但是在方法调用函数前,函数必须已经定义好,否则会出错

为自定义的函数创建新的实例一样是使用 new 语句。

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

?>

2012-1-30 11:38 Monday  

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

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

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

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

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

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

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

Array ( [0] => .jpg [1] => jpg )
第五个:
jpg
$abc = "asdflkjlkasd.jpg"
2012-1-30 11:34 Monday  
表单的验证一直是网页设计者头痛的问题,表单验证类 Validator就是为解决这个问题而写的,旨在使设计者从纷繁复杂的表单验证中解放出来,把精力集中于网页的设计和功能上的改进上。
    Validator是基于JavaScript技术的伪静态类和对象的自定义属性,可以对网页中的表单项输入进行相应的验证,允许同一页面中同时验证多个表单,熟悉接口之后也可以对特定的表单项甚至仅仅是某个字符串进行验证。因为是伪静态类,所以在调用时不需要实例化,直接以"类名+.语法+属性或方法名"来调用。此外,Validator还提供3种不同的错误提示模式,以满足不同的需要。
Validator目前可实现的验证类型有:
1.是否为空;
2.中文字符;
3.双字节字符
4.英文;
5.数字;
6.整数;
7.实数;
8.Email地址;
9.使用HTTP协议的网址;
10.电话号码;
11.货币;
12.手机号码;
13.邮政编码;
14.身份证号码(1.05增强);
15.QQ号码;
16.日期;
17.符合安全规则的密码;
18.某项的重复值;
19.两数的关系比较;
20.判断输入值是否在(n, m)区间;
21.输入字符长度限制(可按字节比较);
22.对于具有相同名称的单选按钮的选中判断;
23.限制具有相同名称的多选按钮的选中数目;
24.自定义的正则表达式验证;
25.文件上传格式过滤(1.04新增)。

更新历史:

1.01
修正对12月份的日期验证(感谢 flylg999 )

1.03
修正Range验证类型时将数字当字符串比较的bug(感谢 cncom 和 xtlhnhbb )
修正日期验证(感谢 Papsam )
增加Username验证类型
增加对Phone验证类型时支持分机号

1.04
增加文件格式的过滤,用于上传时限制上传的文件格式

1.05
增强对身份证号码的验证
运行环境(客户端):
在Windows Server 2003下用IE6.0+SP1和Mozilla Firefox 1.0测试通过;
在Lunix RedHat 9下的Netscape测试通过;

Validator 完整代码:

<script>
/*************************************************
Validator v1.05
code by 我佛山人
wfsr@msn.com
*************************************************/
Validator = {
Require : /.+/,
Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,
Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/,
Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
IdCard : "this.IsIdCard(value)",
Currency : /^\d+(\.\d+)?$/,
Number : /^\d+$/,
Zip : /^[1-9]\d{5}$/,
QQ : /^[1-9]\d{4,8}$/,
Integer : /^[-\+]?\d+$/,
Double : /^[-\+]?\d+(\.\d+)?$/,
English : /^[A-Za-z]+$/,
Chinese : /^[\u0391-\uFFE5]+$/,
Username : /^[a-z]\w{3,}$/i,
UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
IsSafe : function(str){return !this.UnSafe.test(str);},
SafeString : "this.IsSafe(value)",
Filter : "this.DoFilter(value, getAttribute('accept'))",
Limit : "this.limit(value.length,getAttribute('min'), getAttribute('max'))",
LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
Range : "getAttribute('min') < (value|0) && (value|0) < getAttribute('max')",
Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
Custom : "this.Exec(value, getAttribute('regexp'))",
Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
ErrorItem : [document.forms[0]],
ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
Validate : function(theForm, mode){
var obj = theForm || event.srcElement;
var count = obj.elements.length;
this.ErrorMessage.length = 1;
this.ErrorItem.length = 1;
this.ErrorItem[0] = obj;
for(var i=0;i<count;i++){
with(obj.elements[i]){
var _dataType = getAttribute("dataType");
if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined") continue;
this.ClearState(obj.elements[i]);
if(getAttribute("require") == "false" && value == "") continue;
switch(_dataType){
case "IdCard" :
case "Date" :
case "Repeat" :
case "Range" :
case "Compare" :
case "Custom" :
case "Group" :
case "Limit" :
case "LimitB" :
case "SafeString" :
case "Filter" :
if(!eval(this[_dataType])) {
this.AddError(i, getAttribute("msg"));
}
break;
default :
if(!this[_dataType].test(value)){
this.AddError(i, getAttribute("msg"));
}
break;
}
}
}
if(this.ErrorMessage.length > 1){
mode = mode || 1;
var errCount = this.ErrorItem.length;
switch(mode){
case 2 :
for(var i=1;i<errCount;i++)
this.ErrorItem[i].style.color = "red";
case 1 :
alert(this.ErrorMessage.join("\n"));
this.ErrorItem[1].focus();
break;
case 3 :
for(var i=1;i<errCount;i++){
try{
var span = document.createElement("SPAN");
span.id = "__ErrorMessagePanel";
span.style.color = "red";
this.ErrorItem[i].parentNode.appendChild(span);
span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
}
catch(e){alert(e.description);}
}
this.ErrorItem[1].focus();
break;
default :
alert(this.ErrorMessage.join("\n"));
break;
}
return false;
}
return true;
},
limit : function(len,min, max){
min = min || 0;
max = max || Number.MAX_VALUE;
return min <= len && len <= max;
},
LenB : function(str){
return str.replace(/[^\x00-\xff]/g,"**").length;
},
ClearState : function(elem){
with(elem){
if(style.color == "red")
style.color = "";
var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
if(lastNode.id == "__ErrorMessagePanel")
parentNode.removeChild(lastNode);
}
},
AddError : function(index, str){
this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
},
Exec : function(op, reg){
return new RegExp(reg,"g").test(op);
},
compare : function(op1,operator,op2){
switch (operator) {
case "NotEqual":
return (op1 != op2);
case "GreaterThan":
return (op1 > op2);
case "GreaterThanEqual":
return (op1 >= op2);
case "LessThan":
return (op1 < op2);
case "LessThanEqual":
return (op1 <= op2);
default:
return (op1 == op2);
}
},
MustChecked : function(name, min, max){
var groups = document.getElementsByName(name);
var hasChecked = 0;
min = min || 1;
max = max || groups.length;
for(var i=groups.length-1;i>=0;i--)
if(groups[i].checked) hasChecked++;
return min <= hasChecked && hasChecked <= max;
},
DoFilter : function(input, filter){
return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);
},
IsIdCard : function(number){
var date, Ai;
var verify = "10x98765432";
var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var area = ['','','','','','','','','','','','北京','天津','河北','山西','内蒙古','','','','','','辽宁','吉林','黑龙江','','','','','','','','上海','江苏','浙江','安微','福建','江西','山东','','','','河南','湖北','湖南','广东','广西','海南','','','','重庆','四川','贵州','云南','西藏','','','','','','','陕西','甘肃','青海','宁夏','新疆','','','','','','台湾','','','','','','','','','','香港','澳门','','','','','','','','','国外'];
var re = number.match(/^(\d{2})\d{4}(((\d{2})(\d{2})(\d{2})(\d{3}))|((\d{4})(\d{2})(\d{2})(\d{3}[x\d])))$/i);
if(re == null) return false;
if(re[1] >= area.length || area[re[1]] == "") return false;
if(re[2].length == 12){
Ai = number.substr(0, 17);
date = [re[9], re[10], re[11]].join("-");
}
else{
Ai = number.substr(0, 6) + "19" + number.substr(6);
date = ["19" + re[4], re[5], re[6]].join("-");
}
if(!this.IsDate(date, "ymd")) return false;
var sum = 0;
for(var i = 0;i<=16;i++){
sum += Ai.charAt(i) * Wi[i];
}
Ai += verify.charAt(sum%11);
return (number.length ==15 || number.length == 18 && number == Ai);
},
IsDate : function(op, formatString){
formatString = formatString || "ymd";
var m, year, month, day;
switch(formatString){
case "ymd" :
m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
if(m == null ) return false;
day = m[6];
month = m[5]*1;
year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
break;
case "dmy" :
m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
if(m == null ) return false;
day = m[1];
month = m[3]*1;
year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
break;
default :
break;
}
if(!parseInt(month)) return false;
month = month==0 ?12:month;
var date = new Date(year, month-1, day);
return (typeof(date) == "object" && year == date.getFullYear() && month == (date.getMonth()+1) && day == date.getDate());
function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
}
}
</script>

2012-1-30 11:33 Monday  
<?php

/*

    author:流水孟春

*/
require_once('./FCKeditor/fckeditor.php');
require_once('./Smarty/Smarty.class.php'); //载入Smarty

$smarty = new Smarty();
/* Smarty配置 */
$smarty->template_dir = "./templates/default";
$smarty->compile_dir = "./templates/compiled"; //

$smarty->config_dir = "./templates/configs"; //

$smarty->cache_dir = "./caches";
$smarty->left_delimiter = '{';
$smarty->right_delimiter = '/}';


createEditor('FCKeditor1');
$smarty->display('editor.htm');

/**
* 生成编辑器
* @param string inputName 输入框名称
* @param string inputValue 输入框值
* @param string height 高
* @param string toolbarSet 工具条设置
*/
function createEditor($inputName, $inputValue = '',$height='320',$toolbarSet='Default'){
    $editor = new FCKeditor($inputName) ;
    $editor->BasePath = "../libs/editor/";
    $editor->ToolbarSet = "Default";
    $editor->Width = "100%";
    $editor->Height = $height;
    $editor->Value = $inputValue;
    $GLOBALS['smarty']->assign("editor", $editor->CreateHtml());
}

?>


editor.htm的内容:
{$editor/}

2012-1-30 11:32 Monday  

require_once 'Zend/Db.php';
require_once 'Zend/Db/Table.php';
$params = array ('host'     => 'localhost',
                 'username' => 'root',
                 'password' => 'yourpassword',
                 'dbname'   => 'yourdbname');
$db = Zend_Db::factory('PDO_MYSQL', $params);
$db->query('set names utf8');
Zend_Db_Table::setDefaultAdapter($db);
class ContentTable extends Zend_Db_Table {
protected $_name = 'jos_content';
}
$table = new ContentTable();
$rowset = $table->fetchAll(null, 'id ASC', 10, 0);
$title = '';
foreach ($rowset as $row) {  
   $title.=$row->title;
}

注意这一行:$db->query('set names utf8');
因为数据库的默认字符集是是utf8 ,所以这一行是必须的,否则你读出来的中文就成了乱码了。

2012-1-30 11:32 Monday  
{if $_global_password} 是判断变量存不存在....

{if $_global_password!==''} 是判断变量等不等于空....

Smarty 中的 if 语句和 php 中的 if 语句一样灵活易用,并增加了几个特性以适宜模板引擎. if 必须于 /if 成对出现. 可以使用 else 和 elseif 子句. 可以使用以下条件修饰词:eq、ne、neq、gt、lt、lte、le、gte、ge、is even、is odd、is not even、is not odd、not、mod、div by、even by、odd by、==、!=、>、<、<=、>=. 使用这些修饰词时必须和变量或常量用空格格开.

equal : 相等、not equal:不等于、greater than:大于、less than:小于、less than or equal:小于等于、great than or equal:大于等于、is even:是偶数、is odd:是奇数、is not even:不是偶数、is not odd:不是奇数、not:非、mod:取余、div by:被。。。除

为什么有些函数连PHP也没自带呢?

2012-1-30 11:31 Monday  
eq       equal : 相等
neq       not equal:不等于
gt        greater than:大于
lt        less than:小于
lte       less than or equal:小于等于
gte       great than or equal:大于等于
is even:是偶数
is odd:是奇数
is not even:不是偶数
is not odd不是奇数
not:非
mod:取余
div by:被...除
1.显示本月第一天

以下是引用片段:
SELECT DATEADD(mm,DATEDIFF(mm,0,getdate()),0)
select convert(datetime,convert(varchar(8),getdate(),
120)+’01’,120)
2.显示本月最后一天

以下是引用片段:
select dateadd(day,-1,convert(datetime,convert
(varchar(8),dateadd(month,1,getdate()),120)+’01’,120))
SELECT dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0))
3.上个月的最后一天

以下是引用片段:
SELECT dateadd(ms,-3,DATEADD(mm,DATEDIFF(mm,0,getdate()),0))
4.本月的第一个星期一i

以下是引用片段:
select DATEADD(wk,DATEDIFF(wk,0, dateadd(dd,6-datepart(
day,getdate()),getdate())),0)
5.本年的第一天

以下是引用片段:
SELECT DATEADD(yy,DATEDIFF(yy,0,getdate()),0)

6.本年的最后一天

以下是引用片段:
SELECT dateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate())+1,0))
7.去年的最后一天

以下是引用片段:
SELECT dateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate()),0))

8.本季度的第一天

以下是引用片段:
SELECT DATEADD(qq,DATEDIFF(qq,0,getdate()),0)
9.本周的星期一

以下是引用片段:
SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),0)
10.查询本月的记录

以下是引用片段:
select * from tableName where DATEPART(mm, theDate)
=DATEPART(mm, GETDATE()) and DATEPART(yy, theDate)
= DATEPART(yy, GETDATE())

11.查询本周的记录

以下是引用片段:
select * from tableName where DATEPART(wk, theDate) = DATEPART
(wk, GETDATE()) and DATEPART(yy, theDate) = DATEPART(yy, GETDATE())

12查询本季的记录 注:其中:GETDATE()是获得系统时间的函数。

以下是引用片段:
select * from tableName where DATEPART(qq, theDate) = DATEPART
(qq, GETDATE()) and DATEPART(yy, theDate) = DATEPART(yy, GETDATE())

13.获取当月总天数:

以下是引用片段:
select DATEDIFF(dd,getdate(),DATEADD
(mm, 1, getdate()))

select datediff(day,
dateadd(mm, datediff(mm,’’,getdate()), ’’),
dateadd(mm, datediff(mm,’’,getdate()), ’1900-02-01’))
14.获取当前为星期几

以下是引用片段:
DATENAME(weekday, getdate())


2012-1-30 11:29 Monday  

花了大半个上午,就整出这个东西

<?php
/**
* @what 分页类
* @author Aboc QQ:9986584
* @version 1.0
* @date 2008-8-31
*/

class page{
var $page_name='page'; //数据名称
var $page_size; //每页条数
var $db;//数据操作对象
var $page_num;//总页数
var $page=0; //当前页码
var $num; //数据总条数

/**
* Enter 取得分页数据
*
* @param unknown_type $sql
* @param unknown_type $db
* @param unknown_type $page_size
* @return array;
*/
function getData($sql,$db,$page_size=20){
   $this->page_size=$page_size;
   if(strripos($sql,'limit') != false)die('SQL中不可出现limit');
   if($page_size<=0)die('$page_size设置错误');
   $sql=trim($sql);
   $this->num=$db->getnum($sql);
   if($this->num<=$page_size){
    $this->page_num=0;
   }else{
    $this->page_num=ceil($this->num/$page_size)-1;
   }
   if(empty($_GET[$this->page_name]) || $_GET[$this->page_name] <0 ){
    $this->page=0;
   }elseif($_GET[$this->page_name] > $this->page_num){
    $this->page=$this->page_num;
   }else{
    $this->page=$_GET[$this->page_name];
   }
   $sql.=' limit '.($this->page*$page_size).','.$page_size;
   $row=$db->getall($sql);
   //echo $sql;
   return $row;  
}

/**
* 返回去除$page_name之后的查询字串
*
* @return unknown
*/
function getquery(){
   $query=$_SERVER['QUERY_STRING'];
   //echo $query;
   //echo $this->page_name;
   //echo strripos($query,$this->page_name);
   //echo strpos($query,$this->page_name);
   if(empty($query)) return false;
   if(($end=strpos($query,$this->page_name)) !== false){
    if($end==0) $end=1;
    $query=substr($query,0,$end-1);
   }
   //echo $query;
   return $query;
}

/**
* 输出分页链接
*
* @return unknown
*/
function pagelist(){
   $query=$this->getquery();
   if(empty($query)){
    $query='';
   }else{
    $query=$query.'&';
   }
   $total='总共'.$this->num.'条 每页'.$this->page_size.'条';
   $startpage='<a href="?'.$query.$this->page_name.'=0">首页</a>';
   $endpage='<a href="?'.$query.$this->page_name.'='.$this->page_num.'">尾页</a>';
   if($this->page==0){
    $prepage='上一页';
   }else{
    $prepage='<a href="?'.$query.$this->page_name.'='.($this->page-1).'">上一页</a>';
   }
   if($this->page==$this->page_num){
    $nextpage='下一页';
   }else{
    $nextpage='<a href="?'.$query.$this->page_name.'='.($this->page+1).'">下一页</a>';
   }
   return $total.' '.$startpage.' '.$prepage.' '.$nextpage.' '.$endpage;
}
  
}
?>

演示就是下面这个样子的

2012-1-30 11:29 Monday  
<script>  
function   show(username)  
{
document.all.userinfo.innerHTML='信息读取中...';
document.all.userinfo.style.display="block";   
document.all.userinfo.style.left=event.x;  
document.all.userinfo.style.top=document.body.scrollTop+event.y;  
//xajax_getlyuserinfo(username);     //异步处理,生成卡片
}  
</script>

<div   id="userinfo"   style="position:absolute;z-index:100;left:15px;top:180px;display:none;border:1px   solid   #dddddd;background-color:#eeeeee;width:250px;height:102" onmouseout='document.all.userinfo.style.display="none"' onmouseover='document.all.userinfo.style.display="block"'></div>
然后调用时用经过或是点击什么的就行了
2012-1-30 11:28 Monday  
ob_start()函数:打开输出缓冲区.

    函数格式 void ob_start(void)
    说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。

Flush:刷新缓冲区的内容,输出。

    函数格式:flush()
    说明:这个函数经常使用,效率很高。

ob_get_contents :返回内部缓冲区的内容。

    函数格式:string ob_get_contents(void)
    说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE.

ob_get_length:返回内部缓冲区的长度。

    函数格式:int ob_get_length(void)
    说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活,则返回 FALSE.

ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区

    函数格式:void ob_end_clean(void)
    说明:这个函数不会输出内部缓冲区的内容而是把它删除

ob_end_flush:发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区

    函数格式:void ob_end_flush(void)
    说明:这个函数发送输出缓冲区的内容(如果有的话)

ob_implicit_flush:打开或关闭绝对刷新

    函数格式:void ob_implicit_flush ([int flag])
    说明:默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()