快速判斷字串是否含 HTML 標籤,最簡單的方法是對比原字串與 strip_tags() 處理後的結果。本文提供一行式函式與進階正則版本,並說明適用場景與效能。
function hasHtmlTags($str) {
return $str !== strip_tags($str);
}
// 使用
var_dump(hasHtmlTags('Hello
')); // true
var_dump(hasHtmlTags('Hello World')); // false
strip_tags() 會移除所有 HTML / PHP 標籤,保留純文字內容。!== 比較即可。function hasDisallowedTags($str, $allowed = '') {
$stripped = strip_tags($str, $allowed);
return $str !== $stripped;
}
// 僅允許
var_dump(hasDisallowedTags('粗體')); // true (含 script)
var_dump(hasDisallowedTags('粗體斜體')); // false
function hasHtmlTagsRegex($str) {
return preg_match('/<[^>]+>/', $str) === 1;
}
// 缺點:誤判 "<3" 為標籤、無法正確處理屬性內含 >、效能較差
| 方法 | 耗時 (秒) | 備註 |
|---|---|---|
| strip_tags 比對 | ~0.12 | 最快、最準確 |
| preg_match | ~0.45 | 較慢、邊界情況易出錯 |
| strpos 檢查 < & > | ~0.08 | 最快但誤判率高 (如 "a |
function sanitizeInput($input, $allowHtml = false) {
if (is_array($input)) {
return array_map(__FUNCTION__, $input);
}
if (!$allowHtml && hasHtmlTags($input)) {
// 選項 1:拒絕
// throw new InvalidArgumentException('輸入不得包含 HTML 標籤');
// 選項 2:轉義
return htmlspecialchars($input, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
// 選項 3:清理 (僅保留安全標籤)
// return strip_tags($input, '');
}
return $input;
}
$_POST = sanitizeInput($_POST);
$_GET = sanitizeInput($_GET);
strip_tags 比對法是 PHP 偵測 HTML 標籤的黃金標準:簡潔、高效、零依賴,建議作為預設方案。