我有一个简单的编辑器,我允许人们更新网站的部分文本。 当我实际渲染其内容时,我允许使用html替换一些伪标记。我想使用正则表达式来定位这些标记,并用适当的html标记替换它们。
基本上会有一个文本块可能包含以下一个或多个嵌入式伪标记,我需要使用c#替换正则表达式:
[E]me@myemail.com[/E]
需要变成
<a class='LinkText' href='mailto:me@myemail.com'>me@myemail.com</a>
和
[L text='My Link Text']www.google.com[/L]
需要变成
<a class="MyLinkClass" href="www.google.com">My Link Text</a>
对于电子邮件伪标签,我提出了以下正则表达式,但它不起作用:
Content = Regex.Replace(Content, @"\[E\](?(email)[^<>]+)\[/E\]", "<a class='LinkText' href='mailto:?{email}'>?{email}</a>");
由于我坚持这个,我也没有在另一个上取得很大进展。
有什么想法我可以让这个工作?我总是在这些正则表达式的语法上挣扎......任何帮助或方向都会非常感激!!
答案 0 :(得分:1)
一些指示:
(?<name>subexpression)
Regex.Replace
访问指定的捕获组时,您可以使用${name}
访问指定的捕获组。除此之外,你非常接近。这里有两个正则表达式应该是一个很好的起点:
链接:
string linkReplacement =
Regex.Replace(
linkContent,
@"\[L text='(?<text>[^']*)'\](?<link>[^\]]*)\[/L\]",
"<a class='MyLinkClass' href='${link}'>${text}</a>");
电子邮件:
string emailReplacement =
Regex.Replace(
emailContent,
@"\[E\](?<email>[^\]]*)\[/E\]",
"<a class='LinkText' href='mailto:${email}'>${email}</a>");
工作示例: https://dotnetfiddle.net/nhsoJ9
编辑:已更新,以消除贪婪。
答案 1 :(得分:0)
在LINQPad中掀起了这个......
void Main()
{
string s =
@"[E]me@myemail.com[/E]
blagra
shlarga";
foreach ( Match m in Regex.Matches( s, @"\[E\](\w+@\w+.\w+)\[/E\]") )
{
string emailMatch = m.Groups[1].Value;
string entireMatch = m.Groups[0].Value;
string replacement = string.Format( @"<a class=""MyLinkClass"" href=""{0}"">My Link Text</a>", m.Groups[1] );
string newString = s.Replace( entireMatch, replacement );
newString.Dump();
}
}
第二次更换留给读者:); - )
您可以简化这一行:
foreach ( Match m in Regex.Matches( s, @"\[E\](\w+@\w+.\w+)\[/E\]") )
是:
foreach ( Match m in Regex.Matches( s, @"\[E\](.+)\[/E\]") )
如果你愿意的话。