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

C# 使用C自动超链接URL和电子邮件,同时保留定制标记,c#,asp.net,regex,C#,Asp.net,Regex,我有一个网站,使用户可以向论坛发布消息 目前,如果用户键入一个web地址或电子邮件地址并发布,它将被视为与任何其他文本相同的内容 有一些工具可以让用户通过一些定制的标记/标记提供超链接的web和电子邮件地址,这些工具有时会使用,但并不总是使用。此外,定制的“图像”标签还可用于引用web上托管的图像 我的目标是既满足那些使用这些现有工具生成超链接地址的人,也满足那些只需在中键入web或电子邮件地址的人,然后在他们提交帖子时自动将其转换为超链接地址 我发现有一两个正则表达式可以转换纯字符串web或电

我有一个网站,使用户可以向论坛发布消息

目前,如果用户键入一个web地址或电子邮件地址并发布,它将被视为与任何其他文本相同的内容

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

我的目标是既满足那些使用这些现有工具生成超链接地址的人,也满足那些只需在中键入web或电子邮件地址的人,然后在他们提交帖子时自动将其转换为超链接地址

我发现有一两个正则表达式可以转换纯字符串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.
不幸的是,我们有很多历史数据都是用这种定制的标签存储的,所以现在,我们希望保留这些数据,而不是采用一种全新的方式来存储我们的用户帖子

任何帮助都将不胜感激


谢谢。

您需要在正则表达式中添加负面环视断言。NET完全支持这一点

消极前瞻断言您的模式后面没有任何东西。语法是什么?!xxx,其中xxx是定义您不想要的内容的模式。你可以用吗\例如,[\/URL\]用于链接


负向后看看起来像?。在这里,你需要一个模式-类似于但是,如果需要的话,您可以使其更加健壮。

您需要向正则表达式中添加否定的环视断言。NET完全支持这一点

消极前瞻断言您的模式后面没有任何东西。语法是什么?!xxx,其中xxx是定义您不想要的内容的模式。你可以用吗\例如,[\/URL\]用于链接


负向后看看起来像?。在这里,你需要一个模式-类似于但是如果需要的话,你可以使它更加健壮。

Jay是对的,不过你也可以使用那些与正则表达式匹配的普通链接,只需将\b添加到开头和结尾,这样它就只匹配周围没有内容的链接,即你的论坛代码标签

\b是单词边界,即空格、句点、逗号等,表示它是一个独立的单词,而不是更大单词的一部分


我对我的论坛软件也做了同样的事情。我首先解析了论坛代码,因此它构建了锚定标记,然后我使用这样的正则表达式自己寻找普通链接并进行了转换。

Jay是对的,不过你也可以使用那些与正则表达式匹配的普通链接,只需将\b添加到开头和结尾,这样它就只匹配周围没有内容的链接,即你的论坛代码标签

\b是单词边界,即空格、句点、逗号等,表示它是一个独立的单词,而不是更大单词的一部分


我对我的论坛软件也做了同样的事情。我首先解析了论坛代码,因此它构建了锚定标记,然后我使用这样一个正则表达式自己寻找普通链接,并对其进行了转换。

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

/// <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();
    }

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

/// <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();
    }

你要找的正则表达式是?。至少,这是你需要的电子邮件标签。你的替代者就是[EMAIL=$1]$1[/EMAIL]。对于其他人,您需要用适当的内容替换中心组和电子邮件标签

测试用例:

[电邮]=bob@smith.com]bob@smith.com[/EMAIL]:错误 don@smith.com:对


根据您的标记在.NET正则表达式下进行评估。

您要查找的正则表达式是?。至少,这是你需要的电子邮件标签。你的替代者就是[EMAIL=$1]$1[/EMAIL]。对于其他人,您需要用适当的内容替换中心组和电子邮件标签

测试用例:

[电邮]=bob@smith.com]bob@smith.com[/EMAIL]:错误 don@smith.c 奥姆:是的



根据您的标记在.NET正则表达式下进行计算。

因此,将负向后看放在正则表达式前面,负向前看放在末尾,只有在模式前面或后面没有这些标记时才会匹配。感谢您提供的信息。到目前为止,我已经做了以下工作,但它忽略了[URL=]标记的字符串,这很好:Regex urlregex=new Regex@?坦率地说,我更喜欢Amethi的解决方案——更简单。它与StackOverflow上的工作原理类似。您需要在parens中创建替换组-换行选项,并按管道字符|分隔,因此如果您想匹配a、b或c,您可以使用a | b | c。不过,这会变得很糟糕,而且我不确定一个非常复杂的正则表达式是否会比三个具有更简单模式的过程更有效。我会把它作为三个独立的正则表达式来尝试,只有在匹配太慢的情况下才尝试组合。谢谢你的额外反馈。我刚刚尝试了Amethi提供的代码示例,我认为目前情况看起来不错——我会做一些进一步的测试,然后再报告。再次感谢。因此,将负向后看放在你的正则表达式前面,负向前看放在末尾,你的模式只有在前面或后面没有这些标记时才会匹配。谢谢你提供的信息。到目前为止,我已经做了以下工作,但它忽略了[URL=]标记的字符串,这很好:Regex urlregex=new Regex@?坦率地说,我更喜欢Amethi的解决方案——更简单。它与StackOverflow上的工作原理类似。您需要在parens中创建替换组-换行选项,并按管道字符|分隔,因此如果您想匹配a、b或c,您可以使用a | b | c。不过,这会变得很糟糕,而且我不确定一个非常复杂的正则表达式是否会比三个具有更简单模式的过程更有效。我会把它作为三个独立的正则表达式来尝试,只有在匹配太慢的情况下才尝试组合。谢谢你的额外反馈。我刚刚尝试了Amethi提供的代码示例,我认为目前情况看起来不错——我会做一些进一步的测试,然后再报告。再次感谢。嗨,阿梅西。谢谢你的信息。此句柄是否会处理作为post中第一个文本项出现的地址,即在新行的开头或之前没有空格?如果是这样,语法将如何应用于我现有的普通链接匹配正则表达式?例如,Regex urlregex=newRegex@http:\/\/[\w.]+\/?\S*,RegexOptions.IgnoreCase | RegexOptions.Compiled;谢谢。新行是的,第一个字符,我不是很确定,但是如果不是,你可以在文章的开头加一个空格,然后再把它删掉。这不是一个简单的正则表达式解决方案,但我对他们不太在行,不知道如何在一个时髦的正则表达式中完成这一切。至于实现它,它应该是这样的:new Regex@\bhttp:\/\/[\w.]+\/?\S*\b,RegexOptions.IgnoreCase | RegexOptions.Compiled;但不要引用我的话。你必须把它塞进一个regex测试仪——在线加载,或者你可以下载免费软件应用。哦,还有单元测试,你要为此写一个单元测试,对吗我刚刚尝试了您提供的示例,但不幸的是,它仍然与我定制的标记文本匹配,例如[URL=:Re:unittests,[假装]是[/假装]:/Hi Amethi。感谢您提供的信息。此句柄是否会显示为文章中的第一项文本,即新行开头或之前没有空格?如果是,语法将如何应用于与regex匹配的现有普通链接?例如regex urlregex=newRegex@http:\/\/[\w.]+\/?\S*,RegexOptions.IgnoreCase | RegexOptions.Compiled;谢谢。新行是的,第一个字符,我不太确定,但如果不确定,你可以在文章的开头加一个空格,然后把它删掉。这不是一个简单的正则表达式解决方案,但我不太擅长于在一个时髦的正则表达式中完成所有的工作。至于实现它,可能会有些困难类似于:new Regex@\bhttp:\/\/[\w.]+\/?\S*\b,RegexOptions.IgnoreCase | RegexOptions.Compiled;但不要引用我的话。你必须把它塞进一个regex测试程序中,那里有在线负载,或者你可以下载免费软件应用程序。哦,还有单元测试,你要为此编写一个单元测试吗?:我刚刚尝试了你提供的示例,但不幸的是,它仍然符合我的bespoke标记的文本,例如[URL=:Re:单元测试,[假装]是[/假装]:/此代码被证明非常有用。我刚刚调整了几个位以适应我的定制标记,到目前为止,它似乎正在勾选所有框-保留我的定制标记,但处理我需要的所有其他URL/电子邮件实例。source=Regex.Replacesource,@[\s]www\.*?| http://.[\s],$1[URL=$2]$2[/URL]$3;source=Regex.Replacesource,@[\s][a-zA-Z_0-9.-+\[a-zA-Z_0-9.-+\.\w+[\s],$1[EMAIL=$2][EMAIL]$2[/EMAIL]$3;source=Regex.Replacesource,@URL=www\,URL=;今天早上我将继续运行一些额外的测试,然后回来……这似乎工作得很好——我已经做了很多测试,并且一直在工作
到目前为止无法打破的东西将标记为接受的答案。再次感谢你的帮助!很高兴它有帮助!正则表达式是我至少要学会的东西之一,下次我需要用它们做点什么的时候就会忘记。如果你在链接末尾加一个逗号,它也会包括在内。此外,如果将链接放在括号中,该链接将不会被激活。对于带有https://support的简单版本:public static string ActivateLinksInTextstring source{source=Regex.Replacesource,@[\s]www\..*?| http.?://.[\s],$1$3;source=Regex.Replacesource,@href=www\,href=\http.?://www;return source;}这段代码非常有用。我刚刚调整了几个位以适应我的定制标记,到目前为止,它似乎在勾选所有框-不处理我的定制标记,但处理我需要的所有其他URL/电子邮件实例。source=Regex.Replacesource,@[\s]www\..*?| http://.*?[\s],$1[URL=$2]$2[/URL]$3;source=Regex.Replacesource,@[\s][a-zA-Z_0-9.-]+\@[a-zA-Z_0-9.-]+\.\w+[\s],$1[EMAIL=$2]$2[/EMAIL]$3;source=Regex.Replacesource,@URL=www\,URL=;今天早上,我将继续进行一些额外的测试,然后回来……这似乎工作得很好——我已经做了很多测试,到目前为止还无法打破这些测试,所以我将把它标记为可接受的答案。再次感谢你的帮助!很高兴它有帮助!正则表达式是我至少要学会的东西之一,下次我需要用它们做点什么的时候就会忘记。如果你在链接末尾加一个逗号,它也会包括在内。此外,如果将链接放在括号中,该链接将不会被激活。对于带有https://support的简单版本:public static string ActivateLinksInTextstring source{source=Regex.Replacesource,@[\s]www\..*?| http.?://.[\s],$1$3;source=Regex.Replacesource,@href=www\,href=\http.?://www;return source;}