PHP支持两种风格的正如l表达式语法:POSIX和Perl,这里我们主要使用更简单的POSIX风格
一、基础知识
正则表达式是一种描述一段文本模式的方法,在PHP中,匹配正则表达式更有点像Strstr()
匹配,而不像相等比较,因为是在一个字符串的某个位置(如果不指明则可能在字符串中的任何位置)匹配另一个字符串。例如,字符串”shop”匹配正则表达式“shop”。它也可以匹配正则表达式“h”、“h。”,等。
二、字符集和类
使用字符集可以马上给出比精确匹配功能还要强大的正则表达式。字符集可以用于匹配属于特定类型的任何字符号 事实上它们是一种通配符。
- 可以用字符作为一个通配符来代替除换行符(\n)之外的任一个字符。 例如,正则表达式:.at
- 如果要限定它是a和z之间的字符, 就可以像这样指明:[a-z]at
1.“.”
例如:“.at”可以与 “cat “、“ sat ”和“mat “等进行匹配。通常,这种通配符用于操作系统中的文件名匹配。
2.“[ ]”
任何包含在方括号“[ ]”中的内容都是一个字符类一一 一个被匹配字符所属的字符集合。 请注意, 方括号中的表达式只匹配一个字符,例如:“[aeiou]”表示一个元音集合;而“[a-zA-Z]”表示一个范围(所有大小写字母)。
3.“^”脱字符
例如:“[^a-z]”可以用来匹配任何不在a和z之间的字符。当把脱字符号“^”包括在方括号里面时, 表示否。
三、重复
通常, 我们会希望指明某个字符串或字符类将不止一次地出现。
1.“*”表示这个模式可以被重复0次或更多次
2.“+”则表示这个模式可以被重复1次或更多次。
这两个符号应该放在要作用的表达式的后面。
四、子表达式
通常,将一个表达式分隔为几个子表达式是非常有用的,例如,可以表示“至少这些字符 审中的一个需要精确匹配”。可以使用圆括号来实现,与在数学表达式中的方楼一样。
例如:(very )*large
可以匹配“large”、“verylarge”、“very very large”等。
五、子表达式计数
可以用在花括号“{}”中的数字表达式来指定内容允许重复的次数。可以指定一个确切的重复次数“{3}”(表示重复3次),或者一个重复次数的范围“{2,4}”(表示重复2-4次),或是一 个开底域的重复范围”{ 2 , }”(表示至少要重复两次)。
例如:(very){1,3}
表示匹配“very”“very very”和“very very very”。
六、定位到字符串的开始或末尾
1.“[a-z]”模式将匹配任何包含了小写字母字符的字符息。无论该字符串只有一个字符,或者 在整个更长的字符串中只包含一个匹配的字符.都没有关系。也可以确定一个特定的子表达式是否出现在开始、末尾或在两个位置都出现。当要确定字 符串中只有要找的单词而没有其他单词出现时,它将相当有用。
2.“^”用于正则表达式的开始,表示子字符串必须出现在被搜索字符串的开始处
3.“$”用于正则表达式的末尾,表示子字符扇必须出现在字符串的末尾。
例如:以下是在字符串开始处匹配bob,
^bob
这个模式将匹配com出现在字符串末尾处的字符串:
com$
最后,这个模式将匹配只包含a到z之间一个字符的字符串:
^[a-z] $ (注意和“[^a-z]”的意思是不同的)
七、分支
可以使用正则表边式中的一条竖线来表示一个选择。 例如, 如果要匹配com、 edu或net,就可以使用如下所示的表达式:
com|edu|net
八、匹配特殊字符
“\”
如果要匹配前面提到过的特殊字符, 例如, . 、 {或者$, 就必须在它们前面加一个反斜杠”\”。 如果要匹配一个反斜杠. 则必须用两个反斜杠“\\”来表示。
注意:在PHP中 , 必须将正则表达式模式包括在一个单引号字符串中。 使用双引号引用的正则表达式将带来一些不必要的复杂性(因为php中的双引号中的内容会经过解释后再输出)。 PHP还使用反斜杠来转义特殊字符一一例如反斜杠。
如果希望在模式中匹配一个反斜杠, 必须使用两个反斜杠来表示它是一个反斜杠字符, 而 不是一个转义字符。
同样, 由于相同的原因, 如果希望在一个双引号引用的PHP字符串中使用反斜杠字符, 必须使用两个反斜杠。 这可能会有些提淆, 这样要求的结果将是表示一个包含了反斜杠字符的正则表达式一个PHP字符串需要4个反斜杠。 PHP解择器将这4个反斜杠解释成2个。 然后, 由正则表达式解释器解析为一个。
$符号也是双引号引用的PHP字符串和正则表达式的特殊字符。要使一个$字符能够在模式中匹配 , 必须用“\\\$”。因为这个字符串被引用在“”中, PHP解释器将其解析为\$,
而则表达式解释器将其解析成一个$字符。
九、特殊字符一览
所有特殊字符的摘要如表1和表2所示。 表1显示了方扩号外特殊字符的意义, 表2显示了当它们用在方括号里面时的意义。
表1,用于方括号外
字符 | 意义 |
---|---|
\ | 转义字符 |
^ | 在字符串开始匹配 |
$ | 在字符串末尾匹配 |
. | 匹配除换行符(\r)之外的字符 |
; | 匹配分支的开始(读为或) |
( | 子模式的开始 |
) | 子模式的结束 |
* | 重复0次或更多次 |
+ | 重复1次或更多次 |
{ | 最小/最大量记号的开始 |
} | 最小/最大量记号的结束 |
? | 标记一个子模式为可选的 |
表2,用于方括号内
字符 | 意义 |
---|---|
\ | 转义字符 |
^ | 非,仅用在开始位置 |
- | 用于指明字符范围 |
十、在智能表单中的应用
1.在智能表单应用程序中, 正则表达式至少有两种用途。 第一种用途是在顾客的反馈中查找特定的名词。 使用正则表达式, 可以做得更智能一些。 使用一个字符串函数, 如果希望匹配“shop” 、“ customer service” 或 “ retail ”,就必须做3次不同的搜索。 如果使用一个 正则表达式, 就可以同时匹配所有3个, 如下所示:shop|customer service|retail
2.第二个用途是验证程序中用户的电子邮件地址, 这需要通过用正则表达式来对电子邮件地址的标准格式进行编码。 这个格式中包含一些数字或标点符号, 接着是符号 “ @ ”,然后是包括文字或数字和字符组成的字符串, 后面接着是一个 “ . ” (点号), 后面包括文字或数字以连字符组成的字符串, 可能还有更多的点号, 直到字符串结束, 它的编码如下所示:
^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+.[a-zA-Z0-9\-.]+$
子表达式“^[a-zA-Z0-9_\-.]+”表示至少由一个字母、 数字、 下画线、 连字符、 点号或者这些字符组合为开始的字符串。请注意, 当在一个字符类的开始或末尾处使用点号时, 点号将失去其特殊通配符的意义, 只能成为一个点号字符。
符号“@”匹配字符“@”。
而子表达式“[a-zA-Z0-9\-]+”与包含文字数字字符和连字符的主机名匹配。请注意, 我们去除了连字符, 因为它是方括号内的特殊字符。
字符组合 “\ . ” 匹配 “ . ”字符。 我们在字符类外部使用点号, 因此必须对其转义, 使其能够匹配一个点号字符。
子表达式“[a-zA-Z0-9-.]+$”匹配域名的剩下部分, 它包含字母、 数字和连字符, 如果需要还可包含更多的点号直到字符串的末尾。
以下是使用正则表达式的PHP函数
十一、用正则表达式查找子字符串
查找子字符串是正则表达式的主要作用。在PHP中,可以使用的并且用于匹配POSIX风格正则表达式的两个函数是ereg()和eregi()。ereg()函数原型如下所示:
int ereg(string pattern,string search,array[matches]);
该函数搜索字符串search,在pattern中寻找与正则表达式相匹配的字符串。如果发现与它相匹配,则将会存储在数组matches中,每个数组元素对应一个子表达式。
函数eregi()除了不区分大小写外,其他功能和ereg()一样。
十二、用正则表达式替换子字符串
与str_replace()函数一样,也可以使用正则表达式来查找和替换子字符串。
在正则表达式中,可以使用的两个函数是ereg_replace()和eregi_replace(不区分大小写)
十三、使用正则表达式分割字符串
主要使用函数split()实现。这队分割电子邮件地址,域名或日期是非常有用的。