到目前为止,验证程序一直都是十分简单的(检查日期、检查所需要的值及检查数据类型或大小)。然而,你常常需要更复杂的验证(例如)以测试一个电子邮件地址或者电话号码是否以正确格式来书写。为了完成这些更复杂的验证任务,聪明的PHP程序员求助于正则表达式。
正则表达式是一种用于模式匹配和替换的强大工具。它们一般和几乎所有的基于UNIX的工具(包括如vi的编辑器、如Perl和PHP的脚本语言以及如awk和sed这样的shell程序)相关联。你甚至会在客户端脚本语言(比如JavaScript)中找到它们。正如圣母玛利亚一样,它们的普及已经超越了语言和领土的边界。
正则表达式允许你使用一组特殊字符来构造模式。这些模式然后可以和文件中的文本、输入到应用程序中的数据或者Web站点的用户填写到表单的输入做比较。适当的程序代码可以取决于这些比较是否存在匹配而被执行。因而正则表达式在Web应用程序中的决策程序中起着重要的作用。
一个正则表达式可以像如下所示一样简单:
这个所做的就是匹配它所应用到的文本中的模式love。和生活中许多其他事情一样,关注模式要比关注概念更简单,但其既不在这儿也不在那儿。
一些更加复杂的正则表达式是什么样子呢?模式/fo+/将会匹配单词fool、footsie和four-seater。试试下面的:
虽然它是一个十分愚蠢的例子,但是你必须承认它的现实性(毕竟,除了热恋中的傻瓜谁会在四座的车辆中调情)。<?php $array = array('fool', 'footsie', 'four-seater'); foreach ($array as $element) { if (preg_match('/fo+/', $element)) echo "$element gives a match<br />\n"; } ?>
上述正则表达式中所用的符号+被称为元字符(当用于模式中时具有特殊含义的字符)。+元字符用于匹配其前述字符的一次或者多次出现(在上面的例子中,这种匹配就是字母f后面紧跟着一个或者多个字母o)。
和+元字符类似的是*和?字符,它们分别用于匹配之前字符的零次或者更多次的出现以及之前字符的零次或者一次出现。因此/ab*/将会匹配aggressive、absolutely和abbey,而/Ron?/将会匹配Ronald、Roger和Roland,但是和Rimbaud或Mona不匹配。
如果所有这些看上去有一些不太严密,那么你也可以为匹配数指定范围。例如,正则表达式/ron{2,6}/将会匹配ronny和ronnnnnny!,但不匹配ron。大括号内的数字代表了匹配范围的下限和上限值;你可以忽略上限值以用于开端式范围的匹配。
正如你可以为待匹配的字符数指定一范围一样,你也可以指定字符的范围。例如。范围/[A-Z]/将匹配包含大写文字字符的任意字符串,而/[a-z]/将匹配任意小写文字字符,以及/[0-9]/将匹配0和9之间的所有数字。
使用这三种字符范围,很容易创建一个正则表达式以匹配一个有序的文字数字混合区段:/([a-z][A-Z][0-9])+/将会匹配一个以相同的字符类型序列排列的文字数字混合字符串(比如,aB2),但无法匹配abc。请注意围绕模式的圆括号(和你可能想像的相反,这些括号在那里不是纯粹来迷惑你的;当将正则表达式片段组合聚合在一起时它会派的上用场的)。
当然,这只是正则表达式冰山的一角。这里有更多的元字符以及数不清的组合方法以创建强大的模式匹配规则。为了更深入的介绍,请访问http://www.melonfire.com/community/columns/trog/article.php?id=2网站、http://it.metr.ou.edu/regex/处的参考页面以及http://www.php.net/manual/en/ref.regex.php和http://www.php.net/manual/en/ref.pcre.php处的PHP手册。你可以在http://www.regexlib.com/处找到一系列用于各种应用的正则表达式例子。