$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$name = sanitize_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z-' ]*$/", $name)) {
$nameErr = "只允许字母、破折号、撇号和空格";
if (empty($_POST["email"])) {
$email = sanitize_input($_POST["email"]);
// 使用 PHP 内置过滤器检查电子邮件地址格式是否良好
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
if (empty($_POST["website"])) {
$website = sanitize_input($_POST["website"]);
// 检查 URL 语法是否有效 (允许 http, https 等方案)
// FILTER_VALIDATE_URL 默认需要包含方案 (scheme)
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $website)) {
$websiteErr = "URL 格式无效";
} else if (!filter_var($website, FILTER_VALIDATE_URL)) {
// 使用 filter_var 作为通用结构的二次检查
// 根据需求,这个检查可能过于严格;正则 (regex) 通常更实用
// $websiteErr = "无效 URL";
if (empty($_POST["comment"])) {
$comment = sanitize_input($_POST["comment"]);
if (empty($_POST["gender"])) {
$gender = sanitize_input($_POST["gender"]);
$allowed_genders = ['female', 'male', 'other'];
if (!in_array($gender, $allowed_genders)) {
$gender = ""; // 如果无效,重置值
// 如果所有验证都通过,则可以处理数据 (例如,保存到数据库)
if (empty($nameErr) && empty($emailErr) && empty($websiteErr) && empty($genderErr)) {
echo "姓名: " . htmlspecialchars($name) . "<br>";
echo "电子邮件: " . htmlspecialchars($email) . "<br>";
echo "网站: " . htmlspecialchars($website) . "<br>
echo "评论: " . nl2br(htmlspecialchars($comment)) . "<br>"; // 使用 nl2br 保留换行符
echo "性别: " . htmlspecialchars($gender) . "<br>";
// $name = $email = $gender = $comment = $website = "";
exit; // 如果重定向或已完成,停止脚本执行
// 注意:在现代 PHP 中不需要 stripslashes()
function sanitize_input($data) {
// $data = stripslashes($data); // 已废弃 - 除非处理旧版 magic_quotes,否则不要使用
// htmlspecialchars 应该用于输出,而不是通常用于输入的存储
<!-- HTML 表单 (如上所示) 在这里 -->
<!-- 它使用 PHP 变量 $name, $email 等来重新填充字段 -->
<!-- 并使用 $nameErr, $emailErr 等来显示错误消息 -->