在論壇、留言板、部落格等使用者產生內容(UGC)場景,使用者常貼上網址或 Email 卻不加超連結標籤。本文示範使用 System.Text.RegularExpressions.Regex 偵測純文字中的 URL 與 Email,並自動替換為 <a href=""> 超連結。
| 類型 | Regex 模式 | 說明 |
|---|---|---|
| URL (HTTP/HTTPS) | https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)? | 支援子域名、路徑、查詢字串;排除中文標點干擾 |
[\w.+-]+@[\w-]+\.[\w.-]+ | 符合 RFC 5322 簡化版;支援 +、.、-、子域名 |
using System;
using System.Text.RegularExpressions;
public static class AutoLinkHelper
{
private static readonly Regex UrlRegex = new Regex(
@"https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex EmailRegex = new Regex(
@"[\w.+-]+@[\w-]+\.[\w.-]+",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
///
/// 將文字中的 URL 轉為超連結(新視窗開啟)
///
public static string AutoLinkUrls(string text, string target = "_blank", string cssClass = "auto-link")
{
if (string.IsNullOrEmpty(text)) return text;
return UrlRegex.Replace(text, m => $@"{m.Value}");
}
///
/// 將文字中的 Email 轉為 mailto: 超連結
///
public static string AutoLinkEmails(string text, string cssClass = "auto-email")
{
if (string.IsNullOrEmpty(text)) return text;
return EmailRegex.Replace(text, m => $@"{m.Value}");
}
///
/// 同時處理 URL 與 Email
///
public static string AutoLinkAll(string text)
{
if (string.IsNullOrEmpty(text)) return text;
text = AutoLinkUrls(text);
text = AutoLinkEmails(text);
return text;
}
}
<%@ Page Language="C#" %>
<%@ Import Namespace="YourNamespace.AutoLinkHelper" %>
<!DOCTYPE html>
<html>
<head>
<title>自動超連結示範</title>
<style>
.auto-link { color: #0066cc; text-decoration: underline; }
.auto-email { color: #009900; text-decoration: underline; }
</style>
</head>
<body>
<form id="form1" runat="server">
<h3>輸入包含網址與 Email 的文字</h3>
<asp:TextBox ID="txtInput" runat="server" TextMode="MultiLine" Rows="5" Columns="60" />
<asp:Button ID="btnConvert" runat="server" Text="轉換" OnClick="btnConvert_Click" />
<hr />
<h3>轉換結果(HTML 輸出)</h3>
<asp:Literal ID="litOutput" runat="server" />
</form>
<script runat="server">
protected void btnConvert_Click(object sender, EventArgs e)
{
string input = txtInput.Text;
// 先 HTML 編碼防止 XSS,再轉換超連結
string encoded = Server.HtmlEncode(input);
string result = AutoLinkHelper.AutoLinkAll(encoded);
litOutput.Text = result;
}
</script>
</body>
</html>
Server.HtmlEncode 將 < > " 編碼,避免使用者輸入 <script>alert(1)</script> 經轉換後執行。http/https,阻擋 javascript:、data:、vbscript: 等危險協定。target="_blank" 連結建議加上 rel="noopener noreferrer" 防止反向存取 window.opener。m.Value.Length > 50 ? m.Value.Substring(0,50)+"..." : m.Value)。// 支援 www. 開頭、ftp、郵件協定
private static readonly Regex ExtendedUrlRegex = new Regex(
@"(?:(?:https?|ftp)://|www\.)[\w-]+(\.[\w-]+)+(/[\w-./?%&=#]*)?",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
// 替換時補齊協定
return ExtendedUrlRegex.Replace(text, m => {
string url = m.Value;
string href = url.StartsWith("www.") ? "https://" + url : url;
return $@"{url}";
});
RegexOptions.Compiled:啟動較慢但執行快,適合靜態唯讀 Regex 物件重複使用。StringBuilder 手動解析,或移至客戶端 JavaScript(如 autolinker.js)處理。static readonly 欄位,避免每次請求重新編譯。自動超連結是提升 UGC 可讀性的實用功能。掌握 Regex 模式設計與 XSS 防禦原則,即可安全地整合至 ASP.NET WebForms、MVC 或 ASP.NET Core 專案中。