c# - 使用 C# 自动超链接 URL 和电子邮件,同时保留定制标签

标签 c# asp.net regex

我有一个网站,允许用户向论坛发布消息。

目前,如果用户键入网址或电子邮件地址并发布,它会被视为与任何其他文本一样。

有一些工具可以让用户提供超链接的网站和电子邮件地址(通过一些定制的标签/标记)——这些工具有时会被使用,但并非总是如此。此外,定制的“图像”标签也可用于引用网络上托管的图像。

我的目标是既迎合那些使用这些现有工具生成超链接地址的人,又迎合那些只需输入网址或电子邮件地址,然后自动将其转换为超链接地址的人他们的地址(一旦他们提交了他们的帖子)。

我发现了一两个正则表达式可以转换纯字符串 Web 或电子邮件地址,但是,我显然不想对已经通过网站定制标记处理的地址执行任何操作,这就是我被困住了 - 如何排除已经通过定制标签满足的任何 Web 或电子邮件地址 - 我不想让它们保持原样。

以下是我需要单独放置的变体的一些定制标记示例:

[URL=www.msn.com]www.msn.com[/URL]

[URL=http://www.msn.com]http://www.msn.com[/URL]

[EMAIL=bob@smith.com]bob@smith.com[/EMAIL]

[IMG]www.msn.com/images/test.jpg[/IMG]

[IMG]http://www.msn.com/images/test.jpg[/IMG]

然而,理想情况下,以下示例需要分别自动转换为 Web 和电子邮件链接:

www.msn.com

http://www.msn.com

bob@smith.com

理想情况下,“转换后的”链接只会根据本文前面的初始示例应用适当的定制标签,而不是:

<a href="..." etc.

他们会变成:

[URL=http://www.. etc.)

不幸的是,我们有大量的历史数据存储在这个定制标签中,所以现在,我们想保留它而不是实现一种全新的方式来存储我们的用户帖子。

如有任何帮助,我们将不胜感激。

谢谢。

最佳答案

这是我使用的方法。我现在无法访问完整的代码库,因此看不出它与论坛代码如何配合以停止双重链接,但请尝试一下,看看它是否适合您...

/// <summary>
    /// Turns any literal URL references in a block of text into ANCHOR html elements.
    /// </summary>
    public static string ActivateLinksInText(string source)
    {
        source = " " + source + " ";
        // easier to convert BR's to something more neutral for now.
        source = Regex.Replace(source, "<br>|<br />|<br/>", "\n");
        source = Regex.Replace(source, @"([\s])(www\..*?|http://.*?)([\s])", "$1<a href=\"$2\" target=\"_blank\">$2</a>$3");
        source = Regex.Replace(source, @"href=""www\.", "href=\"http://www.");
        //source = Regex.Replace(source, "\n", "<br />");
        return source.Trim();
    }

关于c# - 使用 C# 自动超链接 URL 和电子邮件,同时保留定制标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3037623/

相关文章:

c# - Windows 服务键盘记录器

c# - 在 WinDbg 中分析 CLR .dmp 文件

c# - 如何全局取消特定业务逻辑的回发事件?

asp.net - 如何在 ASP.NET 中导航页面

python - 使用 findall 捕获组?

c# - C#使用字符串和正则表达式

c# - 在 Windows Installer 中更改应用程序名称

c# - 使用 c# + xaml 对图像进行像素化

javascript - 如果多个用户控件注册 $(document).ready 函数会怎样?

regex - 在 sed 模式中指定 "-"