表單驗證是 Web 應用的基礎防線。本文整理一個實用的 class_post 驗證類別,涵蓋字母數字、純數字、中文字、身分證、Email、電話、郵遞區號、URL 等常見格式檢查,並提供資料清理與輸出轉義方法。
| 方法 | 用途 | 參數說明 |
|---|---|---|
fun_text1($min, $max, $str) | 英數混合長度驗證 | 最小/最大長度、待檢字串 |
fun_text2($min, $max, $str) | 純數字長度驗證 | 同上 |
fun_font($min, $max, $str) | 中文字長度驗證 | 同上(Big5/GBK 環境適用) |
fun_status($str) | 身分證字號格式 | 15/18 位數字或 17 碼+X |
fun_email($str) | Email 格式 | 標準 RFC 5322 簡化版 |
fun_phone($str) | 電話號碼 | 支援區碼、分機格式 |
fun_zip($str) | 郵遞區號 | 6 位數字,首位非 0 |
fun_url($str) | URL 格式 | 以 https:// 開頭 |
data_join(&$data)自動偵測 get_magic_quotes_gpc(),對字串或一維陣列執行 addslashes(),防止 SQL 注入(註:現代應用請改用 Prepared Statements)。
data_revert(&$data)對字串或多維陣列執行 stripslashes(),還原原始資料。
data_show(&$data)執行 nl2br()、htmlspecialchars() 及空白轉換,安全輸出 HTML 內容。建議先呼叫 data_revert()。
<?php
class class_post {
// 驗證英數混合長度
public function fun_text1($min, $max, $str) {
return (bool) preg_match("/^[a-zA-Z0-9]{{$min},{$max}}$/", $str);
}
// 驗證純數字長度
public function fun_text2($min, $max, $str) {
return (bool) preg_match("/^[0-9]{{$min},{$max}}$/i", $str);
}
// 驗證中文字長度(雙位元編碼環境)
public function fun_font($min, $max, $str) {
return (bool) preg_match("/^([\x81-\xfe][\x40-\xfe]){{$min},{$max}}$/", $str);
}
// 身分證字號
public function fun_status($str) {
return (bool) preg_match('/^([\d]{15}|[\d]{18}|[\d]{17}[xX])$/', $str);
}
// Email
public function fun_email($str) {
return (bool) preg_match('/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,}$/i', $str);
}
// 電話
public function fun_phone($str) {
return (bool) preg_match('/^((\d{3})|(\d{3}-))?(0\d{2,3}|0\d{2,3}-)?[1-9]\d{6,7}$/', $str);
}
// 郵遞區號
public function fun_zip($str) {
return (bool) preg_match('/^[1-9]\d{5}$/', $str);
}
// URL
public function fun_url($str) {
return (bool) preg_match('/^https?:\/\/[A-Za-z0-9\-\.]+\.[A-Za-z]{2,}(\/\S*)?$/', $str);
}
// 入庫轉義
public function data_join(&$data) {
if (!get_magic_quotes_gpc()) {
if (is_array($data)) {
foreach ($data as $k => $v) $data[$k] = addslashes($v);
} else {
$data = addslashes($data);
}
}
return $data;
}
// 出庫還原
public function data_revert(&$data) {
if (is_array($data)) {
foreach ($data as $k1 => $v1) {
if (is_array($v1)) {
foreach ($v1 as $k2 => $v2) $data[$k1][$k2] = stripslashes($v2);
} else {
$data[$k1] = stripslashes($v1);
}
}
} else {
$data = stripslashes($data);
}
return $data;
}
// 輸出顯示
public function data_show(&$data) {
if (is_array($data)) {
foreach ($data as $k1 => $v1) {
if (is_array($v1)) {
foreach ($v1 as $k2 => $v2) {
$data[$k1][$k2] = nl2br(htmlspecialchars($data[$k1][$k2]));
$data[$k1][$k2] = str_replace(' ', ' ', $data[$k1][$k2]);
$data[$k1][$k2] = str_replace("\n", '<br>', $data[$k1][$k2]);
}
} else {
$data[$k1] = nl2br(htmlspecialchars($data[$k1]));
$data[$k1] = str_replace(' ', ' ', $data[$k1]);
$data[$k1] = str_replace("\n", '<br>', $data[$k1]);
}
}
} else {
$data = nl2br(htmlspecialchars($data));
$data = str_replace(' ', ' ', $data);
$data = str_replace("\n", '<br>', $data);
}
return $data;
}
}
?>
$validator = new class_post();
$email = 'test@example.com';
if ($validator->fun_email($email)) {
echo 'Email 格式正確';
} else {
echo 'Email 格式錯誤';
}
filter_var() 搭配 FILTER_VALIDATE_EMAIL 等過濾器。addslashes。mb_strlen() 搭配 UTF-8 編碼。