首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 自動偵測文字中的 URL 與 Email 並轉為超連結:Regex 實作指南

     編輯:關於ASP.NET

在論壇、留言板、部落格等使用者產生內容(UGC)場景,使用者常貼上網址或 Email 卻不加超連結標籤。本文示範使用 System.Text.RegularExpressions.Regex 偵測純文字中的 URL 與 Email,並自動替換為 <a href=""> 超連結。

核心正則表達式

類型Regex 模式說明
URL (HTTP/HTTPS)https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?支援子域名、路徑、查詢字串;排除中文標點干擾
Email[\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;
    }
}

ASP.NET 網頁使用範例

<%@ 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>

關鍵安全性注意事項

  1. 先 HtmlEncode 再 AutoLink:範例中先 Server.HtmlEncode 將 < > " 編碼,避免使用者輸入 <script>alert(1)</script> 經轉換後執行。
  2. 限制協定:URL Regex 僅允許 http/https,阻擋 javascript:、data:、vbscript: 等危險協定。
  3. rel="noopener noreferrer":target="_blank" 連結建議加上 rel="noopener noreferrer" 防止反向存取 window.opener。
  4. 長度限制:超長 URL 可能破壞版面,建議截斷顯示(如 m.Value.Length > 50 ? m.Value.Substring(0,50)+"..." : m.Value)。

進階:支援更多 URL 格式

// 支援 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)處理。
  • 快取編譯後的 Regex 為 static readonly 欄位,避免每次請求重新編譯。

結語

自動超連結是提升 UGC 可讀性的實用功能。掌握 Regex 模式設計與 XSS 防禦原則,即可安全地整合至 ASP.NET WebForms、MVC 或 ASP.NET Core 專案中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved