文章出處

網上關于Url轉鏈接(href)的正則表達式一搜一大堆,但真正好用的沒幾個。

后來在Matthew O'Riordan的Blog上發現一個很好用的正則表達式,是用Javascript寫的,代碼如下:

(
  ( // brackets covering match for protocol (optional) and domain
    ([A-Za-z]{3,9}:(?:\/\/)?) // match protocol, allow in format http:// or mailto:
    (?:[\-;:&=\+\$,\w]+@)? // allow something@ for email addresses
    [A-Za-z0-9\.\-]+ // anything looking at all like a domain, non-unicode domains
    | // or instead of above
    (?:www\.|[\-;:&=\+\$,\w]+@) // starting with something@ or www.
    [A-Za-z0-9\.\-]+   // anything looking at all like a domain
  )
  ( // brackets covering match for path, query string and anchor
    (?:\/[\+~%\/\.\w\-]*) // allow optional /path
    ?\??(?:[\-\+=&;%@\.\w]*) // allow optional query string starting with ? 
    #?(?:[\.\!\/\\\w]*) // allow optional anchor #anchor
  )? // make URL suffix optional
)

針對我們的使用場景(只對http或https開頭的Url進行轉換)簡化了一下,并用C#寫出:

public static class ContentFormatter
{
    private static readonly Regex Url_To_Link = new Regex(@"(?<url>
        (https?:(?:\/\/)?)        # match protocol, allow in format http:// or https://
        [A-Za-z0-9\.\-]+          # anything looking at all like a domain, non-unicode domains        
        (                         # brackets covering match for path, query string and anchor
        (?:\/[\+~%\/\.\w\-]*)?    # allow optional /path
        \??(?:[\-\+=&;%@\.\w]*?)  # allow optional query string starting with ? 
        \#?(?:[\.\!\/\\\w\-]*)      # allow optional anchor #anchor
        )?                        # make URL suffix optional
        )",
        RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace,
        TimeSpan.FromMilliseconds(100));

    public static string UrlToLink(string text)
    {
        if (string.IsNullOrEmpty(text)) return string.Empty;

        return Url_To_Link.Replace(text, "<a href=\"${url}\" target=\"_blank\">${url}</a>");
    }
}

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()