掌握 PHP 中的正则表达式 一
PHP 将提供两个 regex 编程接口,一个用于可移植操作系统接口(Portable Operating System Interface,POSIX),另一个接口用于 Perl Compatible Regular Expressions (PCRE)。基本上,推荐使用第二个接口,因为 PCRE 比 POSIX 实现更加强大,可以提供能在 Perl 中找到的所有操作符。
在这里,主要介绍 PCRE 功能。
操作符 | 用途 |
---|---|
.(句点) | 匹配所有单个字符 |
^(脱字符号) | 匹配出现在行或字符串开头的空字符串 |
$(美元符号) | 匹配出现在行尾的空字符串 |
A | 匹配大写字母 A |
a | 匹配小写字母 a |
\d | 匹配所有一位数字 |
\D | 匹配所有单个非数字字符 |
\w | 匹配所有单个字母或数字字符;同义词是 [:alnum:] |
[A-E] | 匹配所有大写的 A、B、C、D 或 E |
[^A-E] | 匹配除大写 A、B、C、D 或 E 之外的任何字符 |
X? | 匹配出现零次或一次的大写字母 X |
X* | 匹配零个或多个大写字母 X |
X+ | 匹配一个或多个大写字母 X |
X{n} | 精确匹配 n 个大写字母 X |
X{n,m} | 至少匹配 n 个且不多于 m 个大写字母 X;如果忽略 m,则表达式将尝试匹配至少 n 个 X |
(abc|def)+ | 匹配一连串的(最少一个)abc 和 def;abc 和 def 将匹配 |
\s 匹配任意的空白符
-
preg_match()
-
preg_match_all()
-
preg_replace()
-
preg_replace_callback()
-
preg_grep()
-
preg_split()
-
preg_last_error()
-
preg_quote()
preg_match()
语法: int preg_match(string pattern, string subject, array [matches]);
返回值: 整数/数组
内容说明
本函数以 pattern 的规则来解析比对字符串 subject。比对结果返回的值放在数组参数 matches 之中,matches[0] 内容就是原字符串 subject、 matches[1] 为第一个合乎规则的字符串、matches[2] 就是第二个合乎规则的字符串,余类推。若省略参数 matches,则只是单纯地比对,找到则返回值为 true。
preg
_
grep
()
语法: array preg_grep( string pattern, array input);
返回值:数组
内容说明
preg_grep() 返回一个数组,其中包括了 input 数组中与给定的 pattern 模式相匹配的单元。
自 PHP 4.0.4 起,preg_grep() 返回的结果使用从输入数组来的键名进行索引。如果不希望这样的结果,用 array_values() 对 preg_grep() 返回的结果重新索引。
preg_split()
语法: array preg_split(string pattern, string subject, int [limit]);
返回值:数组
内容说明
1、本函数可将字符串依指定的规则分开。切开后的返回值为数组变量。参数 pattern 为指定的规则字符串、参数 subject 则为待处理的字符串、参数 limit 可省略,表示欲处理的最多合乎值。
2、preg_split()
的第三个参数和第四个参数都是可选的,但是每个参数都十分有用。给第三个参数提供整数 n 将只返回前 n 个匹配;或者提供 -1
返回所有匹配。如果指定第四个参数,标志 PREG_SPLIT_NO_EMPTY
、preg_split()
将处理所有空结果。
preg_quote()
语法:string preg_quote ( string str [, string delimiter])
内容说明
以 str 为参数并给其中每个属于正则表达式语法的字符前面加上一个反斜线。如果你需要以动态生成的字符串作为模式去匹配则可以用此函数转义其中可能包含的特殊字符。
如果提供了可选参数 delimiter,该字符也将被转义。可以用来转义 PCRE 函数所需要的定界符,最常用的定界符是斜线 /。
正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :
实例:
$keywords = "$40 for a g3/400";
$keywords = preg_quote ($keywords, "/");
echo $keywords; // returns \$40 for a g3\/400
?>
preg_replace()
返回值: 混合类型资料
内容说明
在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
如果搜索到匹配项,则会返回被替换后的 subject,否则返回原来不变的 subject
实例(返回值为 $startDate = 6/19/1969)
说明:
首先,使用 preg_split()
函数把用逗号分隔的单词字符串分隔为单个元素。此函数将在匹配给定 regex 的每个点上划分字符串。代码中的首尾斜杠只表示 regex 的开头和结尾。
preg_split()
的第三个参数和第四个参数都是可选的,但是每个参数都十分有用。给第三个参数提供整数 n 将只返回前 n 个匹配;或者提供 -1
返回所有匹配。如果指定第四个参数,标志 PREG_SPLIT_NO_EMPTY
、preg_split()
将处理所有空结果。
接下来,用逗号分隔的单词列表中的每个元素都是通过 trim()
函数整理的(省略了开始和结束部分的空白),然后与提供的 regex 进行比较。使用函数 preg_grep()
可以非常轻松地处理列表:只需提供模式作为第一个参数,并提供要匹配的单词数组作为第二个参数。函数将返回匹配数组。
^[A-Za-z][A-Za-z0-9_]{2,9}$
作为模式和变长单词列表,则可能获得如下内容:Array ( [0] => martin [1] => 1happy [2] => hermanmunster )
Array ( [0] => martin )
1、${_REQUEST[ 'regex' ]}是哪里来的?
2、怎么如果键入 regex
^[A-Za-z][A-Za-z0-9_]{2,9}$
■ 解析字符串 实例:确定电话号码是否是有效的美国电话号码
先将表单页面完成:
上面的实例,只是检验电话号码是不是有效的,但如果想将区号、前缀分别保存到数据库的独立字段,该怎么办,preg_match()函数完全能做到。
■ 用preg_match()
检索捕捉
只要多加上一个参数,将上面的代码改为:
下面是另一例:提取街道地址
■ 实例:用点替换标点符号
将上面的检验电话号码是否合格的例中,用点替换电码中的标点符号
reference to http://www.ibm.com/developerworks/cn/opensource/os-php-regex1/index.html