PHP 提供了两种方法来验证表单数据项,它们是字符串,但应该是电子邮件 ID 或 URL 的表示形式。检查表单元素是否包含电子邮件/URL 的一种方法是使用 RegEx(正则表达式),另一种更方便的方法是使用 filter_var() 函数。让我们应用这两种方法,并验证表单提交到 PHP 脚本的电子邮件和 URL。
本章使用的 HTML 表单如下 -
<h1>电子邮件和URL验证</h1>
<form action="hello.php" method="POST">
<p><label for="email">输入email:</label>
<input type="text" id="email" name="email"></p>
<p><label for="URL">输入网址<label>
<input type = "text" id="URL" name="url"></p>
<input type="submit">
</form>
使用 Regex 进行验证
PHP 内置函数库包括执行正则表达式匹配的 preg_match() 函数。
preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false
此函数搜索主题以查找与 pattern 中给定的正则表达式的匹配项。如果模式与给定主题匹配,则 preg_match() 返回 1,如果不匹配,则返回 0,失败则返回 false。
有效的电子邮件 ID 应满足以下正则表达式 -
"/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix"
同样,有效的 URL 应满足以下正则表达式 -
"/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i"
如果字符串是有效的电子邮件 ID,则以下函数返回 “1” 或 “0”。
function checkemail($str) {
return (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
}
例子
让我们使用以下 PHP 代码使用 checkmail() 函数来检查上述 HTML 中的 email 字段是否有效 -
<?php
function checkemail($str) {
return (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@
([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$email = $_POST['email'];
if(!checkemail($email)){
echo "电子邮件地址无效.";
} else {
echo "有效的电子邮件地址.";
}
}
?>
HTML 表单呈现如下 -
通过在 email 字段中输入有效/无效的电子邮件字符串来测试 PHP 代码。
以下 checkURL() 函数检查字符串是否表示有效或无效的 URL,并返回 “1 或 ”0”。
function checkURL($str) {
return (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)
[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $str)) ? FALSE : TRUE;
}
例子
从 $_POST 数组提取 URL 字段作为上述函数的参数给出。
<?php
function checkURL($str) {
return (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]
*[-a-z0-9+&@#\/%=~_|]/i", $str)) ? FALSE : TRUE;
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$url = $_POST['url'];
if(!checkURL($url)){
echo "无效URL.";
} else {
echo "有效URL.";
}
}
?>
您可以通过在上述表单的 URL 字段中输入 URL 字符串来测试上述代码。
使用 filter_var() 函数
内置的 filter_var() 函数使用指定的过滤器过滤变量。
filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed
根据作为 $filter 参数值的枚举过滤器 ID ,将检查 $value 参数,该函数将返回过滤后的数据,如果过滤器失败,则返回 false。
有各种预定义的过滤器 ID 常量可用 -
ID | 描述 |
---|---|
FILTER_VALIDATE_BOOL | 对 “1”、“true”、“on” 和 “yes” 返回 true。否则返回 false。 |
FILTER_VALIDATE_DOMAIN | 验证域名标签长度是否有效。 |
FILTER_VALIDATE_EMAIL | 验证该值是否为有效的电子邮件地址。 |
FILTER_VALIDATE_IP | 验证值为 IP 地址 |
FILTER_VALIDATE_URL | 将值验证为 URL |
例子
以下 PHP 脚本验证 HTML 为上述内容提交的电子邮件和 URL 数据 -
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$email = $_POST['email'];
$url = $_POST['url'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "电子邮件格式无效,请重新输入有效电子邮件\n";
}
else
echo "输入的电子邮件格式有效\n";
if (!filter_var($url, FILTER_VALIDATE_URL)) {
echo "URL格式无效,请重新输入有效的URL\n";
}
else
echo "输入的URL格式有效\n";
}
?>
您可以通过输入有效/无效的电子邮件/URL 来测试上述脚本的性能。