在PHP中,正则表达式匹配与ereg()(ereg()函数也有一个被称为eregi()的不分大小写的版本)或者preg_match()函数一起发生。这些语义之间互相稍微不同的函数可以用于与之前定义的模式做比较来测试用户输入且因此在无效数据进入你的应用程序之前捕获它。当然,PHP正则表达式的最常见的例子就是电子邮件地址验证器…而且因为我受传统惯例限制,所以那也是我的第一个例子。请看:
这里,模式/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)*\.([a-zA-Z]{2,6})$/(试着快速说出它!)是一个与用于user@host电子邮件地址的基本格式相匹配的正则表达式。与这个模式相匹配的输入将会被接受;与这个模式不匹配的输入将会触发一个刺耳的报警。请注意,ereg()函数不需要和更快的preg_match()函数一样的分隔符,该preg_match()函数如果在表达式的每一末端没有得到/,其将会抱怨。<html> <head></head> <body> <?php if (!isset($_POST['submit'])) { ?> <form action = '<?php $_SERVER['PHP_SELF'] ?>' method = 'post'> Email address: <br /> <input type = 'text' name = 'email'> <input type = 'submit' name = 'submit' value = 'Save'> </form> <?php } else { // check email address if (!ereg('^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)*\.([a-zA-Z]{2,6})$', $_POST['email'])) { die("Dunno what that is, but it sure isn't an email address!"); } // process the data echo "The email address {$_POST['email']} has a valid structure. Doesn't mean it works!"; } ?> </body> </html>
下面是另外一个例子,该例子较佳用于测试国际电话号码:
如果你稍微玩过这个,你将会看到,例子会接受任意数字+1.212.1234.4567、+44 1865 123456和0091 11 1234 5678...,即使它们每一个格式都不同。这主要是因为我在正则表达式中使用了|分隔符,该分隔符如逻辑“或”一样发挥作用然后使得创建一个内部支持选择的模式变得可能。明显地,你可以在需要时加强模式。举例而言,如果你在印度而且你的应用只支持印度电话号码,那么你可以修改该模式以使得它要求以91(印度的国家代码)作为号码的前两位数字。<html> <head></head> <body> <?php if (!isset($_POST['submit'])) { ?> <form action = '<?php $_SERVER['PHP_SELF'] ?>' method = 'post'> Phone number (with country/area codes): <br /> <input type = 'text' name = 'tel'> <input type = 'submit' name = 'submit' value = 'Save'> </form> <?php } else { // check phone number if (!preg_match('/^(\+|00)[1-9]{1,3}(\.|\s|-)?([0-9]{1,5}(\.|\s|-)?){1,3}$/', $_POST['tel'])) { die ("Dunno what that is, but it sure isn't an international phone number!"); } // process the data echo "{$_POST['tel']} has a valid structure. Doesn't mean it works!"; } ?> </body> </html>
试着使用正则表达式来重写我们早前的验证程序是有趣的。下面是本教程之前例子之一的替代版本,重新编写以使用ereg()函数代替intval()、is_numeric()和isset()函数。
请注意,这里单独一个正则表达式如何代替了早期版本的四次独立测试,以及结果是如何更加简洁的。正是这种强大的能力和灵活性使得正则表达式成为输入验证工具中如此重要的组成部分。<html> <head></head> <body> <?php if (!isset($_POST['submit'])) { ?> <form action = '<?php $_SERVER['PHP_SELF'] ?>' method = 'post'> How many sandwiches would you like? (min 1, max 9) <br /> <input type = 'text' name = 'quantity'> <br /> <input type = 'submit' name = 'submit' value = 'Save'> </form> <?php } else { // check for required data if (!ereg('^[1-9]$', $_POST['quantity'])) { die('ERROR: That is an invalid quantity!'); } // process the data echo "I'm making you {$_POST['quantity']} sandwiches. Hope you can eat them all!"; } ?> </body> </html>