提供的程式碼使用 eregi_replace(已棄用)嘗試將字串中的 Email 與 URL 自動轉為超連結。主要問題在於正則模式不夠嚴謹,且未處理巢狀標籤、特殊字符等邊界情況。
<?php
function auto_link($text) {
// Email 轉換
$text = preg_replace(
'/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/',
'<a href="mailto:$1">$1</a>',
$text
);
// URL 轉換 (簡化版,實際建議使用成熟庫)
$text = preg_replace(
'/(https?:\/\/[^\s<>"]+)/',
'<a href="$1" target="_blank">$1</a>',
$text
);
return $text;
}
$input = "聯絡我: test@example.com 或訪問 https://example.com";
echo auto_link($input);
?>
| 模式 | 說明 |
|---|---|
[a-zA-Z0-9._%+-]+ | 郵箱本地部分:允許字母、數字、點、底線、百分號、加減號 |
@ | 必須包含 @ 符號 |
[a-zA-Z0-9.-]+ | 域名部分:字母、數字、點、連字號 |
\.[a-zA-Z]{2,} | 頂級域:點開頭,至少兩個字母 |
https?://[^\s<>"]+ | URL:http/https 開頭,後接非空白、非標籤字符 |
filter_var($email, FILTER_VALIDATE_EMAIL) 內建函式。league/url 或類似套件。.* 貪婪匹配,改用 .*? 或字符類排除。htmlspecialchars 防 XSS。正則表達式功能強大但易寫難維護。簡單場景可自行撰寫,複雜驗證請善用成熟庫與內建函式,確保正確性與安全性。