掌握 PHP 中的正则表达式 一

PHP 将提供两个 regex 编程接口,一个用于可移植操作系统接口(Portable Operating System Interface,POSIX),另一个接口用于 Perl Compatible Regular Expressions (PCRE)。基本上,推荐使用第二个接口,因为 PCRE 比 POSIX 实现更加强大,可以提供能在 Perl 中找到的所有操作符。

在这里,主要介绍 PCRE 功能。

■  常见 regex 操作符

表 1. 常见 regex 操作符

操作符用途
.(句点)匹配所有单个字符
^(脱字符号)匹配出现在行或字符串开头的空字符串
$(美元符号)匹配出现在行尾的空字符串
A匹配大写字母 A
a匹配小写字母 a
\d匹配所有一位数字
\D匹配所有单个非数字字符
\w匹配所有单个字母或数字字符;同义词是 [:alnum:]
[A-E]匹配所有大写的 A、B、C、DE
[^A-E]匹配大写 A、B、C、DE 之外的任何字符
X?匹配出现零次或一次的大写字母 X
X*匹配零个或多个大写字母 X
X+匹配一个或多个大写字母 X
X{n}精确匹配 n 个大写字母 X
X{n,m}至少匹配 n 个且不多于 m 个大写字母 X;如果忽略 m,则表达式将尝试匹配至少 nX
(abc|def)+匹配一连串的(最少一个)abcdefabcdef 将匹配

 \s  匹配任意的空白符

■  regex 编程常用函数

  • 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_EMPTYpreg_split() 将处理所有空结果。

 

preg_quote()

    语法:string preg_quote ( string str [, string delimiter])
    内容说明
     以 str 为参数并给其中每个属于正则表达式语法的字符前面加上一个反斜线。如果你需要以动态生成的字符串作为模式去匹配则可以用此函数转义其中可能包含的特殊字符。

如果提供了可选参数 delimiter,该字符也将被转义。可以用来转义 PCRE 函数所需要的定界符,最常用的定界符是斜线 /。

正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :

 

 实例:

<?php
$keywords = "$40 for a g3/400";
$keywords = preg_quote ($keywords, "/");
echo $keywords// returns \$40 for a g3\/400
?>


 

preg_replace()

    语法: mixed preg_replace(mixed pattern, mixed replacement, mixed subject);
    返回值: 混合类型资料
    内容说明
    在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
   如果搜索到匹配项,则会返回被替换后的 subject,否则返回原来不变的 subject

实例(返回值为 $startDate = 6/19/1969
Code


 

 

■  实例:比较文本与模式
Code

 说明:

首先,使用 preg_split() 函数把用逗号分隔的单词字符串分隔为单个元素。此函数将在匹配给定 regex 的每个点上划分字符串。代码中的首尾斜杠只表示 regex 的开头和结尾。

preg_split() 的第三个参数和第四个参数都是可选的,但是每个参数都十分有用。给第三个参数提供整数 n 将只返回前 n 个匹配;或者提供 -1 返回所有匹配。如果指定第四个参数,标志 PREG_SPLIT_NO_EMPTYpreg_split() 将处理所有空结果。

接下来,用逗号分隔的单词列表中的每个元素都是通过 trim() 函数整理的(省略了开始和结束部分的空白),然后与提供的 regex 进行比较。使用函数 preg_grep() 可以非常轻松地处理列表:只需提供模式作为第一个参数,并提供要匹配的单词数组作为第二个参数。函数将返回匹配数组。

例如,如果键入 regex ^[A-Za-z][A-Za-z0-9_]{2,9}$ 作为模式和变长单词列表,则可能获得如下内容:
^[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}$

■  解析字符串 实例:确定电话号码是否是有效的美国电话号码

先将表单页面完成:

表单页面


Code

 上面的实例,只是检验电话号码是不是有效的,但如果想将区号、前缀分别保存到数据库的独立字段,该怎么办,preg_match()函数完全能做到。

■ 
用preg_match() 检索捕捉
只要多加上一个参数,将上面的代码改为:

Code


下面是另一例:提取街道地址

Code

同样,整个匹配是在索引 0 处找到的。在哪里找到街道编号?从左侧开始计算,街道编号是由 \d+ 匹配的。左括号是从左侧算起第二个;因此,$matches[2]123$matches[4] 保存城市名称,而 $matches[6] 捕捉 ZIP 编码。所以,输出结果为:
Street: 123 Main
Street number: 123
Street name: Main
City: Warsaw
State: NC
Zip: 29876

 ■  实例:用点替换标点符号

将上面的检验电话号码是否合格的例中,用点替换电码中的标点符号

Code


strcmp()是很经典的函数,两个字符串相等返回0,第一个大于第二个返回>0的数,否则返回<0的数

reference to http://www.ibm.com/developerworks/cn/opensource/os-php-regex1/index.html

posted @ 2009-07-13 13:01  尚远  阅读(617)  评论(0编辑  收藏  举报