Hunte 2000 年 4 月 14 日
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
类似的, 用 表示新行,\r 表示回车其他的特殊符号, 可以用在前面加上反斜杠, 如反斜杠本身用 \\ 表示, 句号. 用. 表示, 以此类推
字符簇
在 INTERNET 的程序中, 正规表达式通常用来验证用户的输入当用户提交一个 FORM 以后, 要判断输入的电话号码地址 EMAIL 地址信用卡号码等是否有效, 用普通的基于字面的字符是不够的
所以要用一种更自由的描述我们要的模式的办法, 它就是字符簇要建立一个表示所有元音字符的字符簇, 就把所有的元音字符放在一个方括号里:
[AaEeIiOoUu]
这个模式与任何元音字符匹配, 但只能表示一个字符用连字号可以表示一个字符的范围, 如:
- [a-z] // 匹配所有的小写字母
- [A-Z] // 匹配所有的大写字母
- [a-zA-Z] // 匹配所有的字母
- [0-9] // 匹配所有的数字
- [0-9\.\-] // 匹配所有的数字, 句号和减号
- [ \f\r\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]
来源: https://www.php1.cn/detail/php-69f6f04227.html