用字符串中的锚标签替换纯文本链接最好的选择是什么? 。净

时间:2010-05-10 15:51:05

标签: .net url

将字符串中的纯文本链接转换为锚标记的最佳选择是什么?

比如我说“我今天去http://www.google.com/搜索了”。我想将其更改为“今天我去 http://www.google.com/进行搜索”。

由于字符串是用户生成的,因此该方法还需要对任何类型的XSS攻击都是安全的。它们在解析之前是安全的,所以我只需要确保通过解析URL没有引入漏洞。

1 个答案:

答案 0 :(得分:1)

一个简单的正则表达式可以得到你想要的东西,因为你说在解析之前字符串是安全的。只需使用以下方法。

private static readonly Regex urlRegex = new Regex(@"(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*", RegexOptions.Compiled);
private static readonly Regex emailRegex = new Regex(@"([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})", RegexOptions.Compiled);
private static readonly IEnumerable<string> disallowedProtocols = new[] { "javascript", "ftp" };
private static string ConvertUrls(string s) {
    s = emailRegex.Replace(
            s,
            match => string.Format(CultureInfo.InvariantCulture, "<a href=\"mailto:{0}\" rel=\"nofollow\">{0}</a>", match.Value)
        );

    s = urlRegex.Replace(
            s,
            match => {
                var protocolGroup = match.Groups["Protocol"];
                if (protocolGroup.Success && !disallowedProtocols.Contains(protocolGroup.Value, StringComparer.OrdinalIgnoreCase)) {
                    return string.Format(CultureInfo.InvariantCulture, "<a href=\"{0}\" rel=\"nofollow\">{0}</a>", match.Value);
                } else {
                    return match.Value;
                }
            }
        );

    return s;
}