在論壇、評論、文章內容等場景中,用戶輸入的純文本 URL、Email 地址需自動識別並轉換為可點擊的 HTML 超連結標籤。本文提供一個健壯的 PHP 函數實現此功能。
function text2links($str = '') {
// 空字串或無特徵字元直接返回
if ($str == '' || !preg_match('/(http|www\.|@)/i', $str)) {
return $str;
}
$lines = explode("\n", $str);
$new_text = '';
while (list($k, $l) = each($lines)) {
// 1. 補全協議頭:www. -> https://www.
$l = preg_replace("/([ \t]|^)www\./i", "\\1https://www.", $l);
// 2. 補全 FTP 協議
$l = preg_replace("/([ \t]|^)ftp\./i", "\\1ftp://ftp.", $l);
// 3. HTTP URL 轉連結
$l = preg_replace(
"/(http:\/\/[^ )\r\n!]+)/i",
"\\1",
$l
);
// 4. HTTPS URL 轉連結
$l = preg_replace(
"/(https:\/\/[^ )\r\n!]+)/i",
"\\1",
$l
);
// 5. FTP URL 轉連結
$l = preg_replace(
"/(ftp:\/\/[^ )\r\n!]+)/i",
"\\1",
$l
);
// 6. Email 地址轉 mailto 連結
$l = preg_replace(
"/([-a-z0-9_]+(\.[_a-z0-9-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)+))/i",
"\\1",
$l
);
$new_text .= $l . "\n";
}
return $new_text;
}
/(http:\/\/[^ )\r\n!]+)/i
/([-a-z0-9_]+(\.[_a-z0-9-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)+))/i
$text = "請訪問 https://example.com 或 https://google.com
聯繫郵箱:admin@example.com
FTP 下載:ftp://files.example.com";
echo text2links($text);
請訪問 https://example.com 或 https://google.com
聯繫郵箱:admin@example.com
FTP 下載:ftp://files.example.com
// 安全版:添加 target="_blank" rel="noopener"
$l = preg_replace(
"/(https?:\/\/[^ )\r\n!]+)/i",
"\\1",
$l
);
此函數已處理常見協議(http、https、ftp、mailto)與邊界情況,可直接整合至專案中使用。