我在执行功能的查找/替换操作时遇到问题,我从文章中提取了 锚点,并用这种格式替换了: [链接锚点] 链接和锚点将是动态的,因此我无法对值进行硬编码,到目前为止,我的操作是:
public static string GetAndFixAnchor(string articleBody, string articleWikiCheck) {
string theString = string.Empty;
switch (articleWikiCheck) {
case "id|wpTextbox1":
StringBuilder newHtml = new StringBuilder(articleBody);
Regex r = new Regex(@"\<a href=\""([^\""]+)\"">([^<]+)");
string final = string.Empty;
foreach (var match in r.Matches(theString).Cast<Match>().OrderByDescending(m => m.Index))
{
string text = match.Groups[2].Value;
string newHref = "[" + match.Groups[1].Index + " " + match.Groups[1].Index + "]";
newHtml.Remove(match.Groups[1].Index, match.Groups[1].Length);
newHtml.Insert(match.Groups[1].Index, newHref);
}
theString = newHtml.ToString();
break;
default:
theString = articleBody;
break;
}
Helpers.ReturnMessage(theString);
return theString;
}
当前,它只是返回原始的文章,并使用传统的锚文本格式: 锚
谁能看到我做错了吗?
致谢
答案 0 :(得分:1)
如果您的输入是HTML,则应考虑使用相应的解析器,HtmlAgilityPack确实很有帮助。
对于当前代码,它看起来太冗长。您可以使用单个Regex.Replace
来执行搜索并一次通过替换:
public static string GetAndFixAnchor(string articleBody, string articleWikiCheck) {
if (articleWikiCheck == "id|wpTextbox1")
{
return Regex.Replace(articleBody, @"<a\s+href=""([^""]+)"">([^<]+)", "[$1 $2]");
}
else
{
// Helpers.ReturnMessage(articleBody); // Uncomment if it is necessary
return articleBody;
}
}
请参见regex demo。
<a\s+href="([^"]+)">([^<]+)
正则表达式匹配<a
,1个或多个空格href="
,然后将"
以外的任何一个或多个字符捕获到组1中,然后匹配{{ 1}},然后将">
以外的任何一个或多个字符捕获到组2中。
<
替换项将匹配的文本替换为[$1 $2]
,组1的内容,空格,组2的内容和[
。
答案 1 :(得分:0)
已更新(已更正的正则表达式以支持空白和换行符)
您可以尝试使用此表达式
Regex r = new Regex(@"<[\s\n]*a[\s\n]*(([^\s]+\s*[ ]*=*[ ]*[\s|\n*]*('|"").*\3)[\s\n]*)*href[ ]*=[ ]*('|"")(?<link>.*)\4[.\n]*>(?<anchor>[\s\S]*?)[\s\n]*<\/[\s\n]*a>");
即使您的锚分割成多行,它也会匹配您的锚。之所以这么长,是因为它支持标记及其值之间的空白,而C#不支持子例程,因此必须[\s\n]*
重复多次。
您可以在dotnetfiddle上看到有效的示例 您可以像这样在示例中使用它。
public static string GetAndFixAnchor(string articleBody, string articleWikiCheck) {
if (articleWikiCheck == "id|wpTextbox1")
{
return Regex.Replace(articleBody,
@"<[\s\n]*a[\s\n]*(([^\s]+\s*[ ]*=*[ ]*[\s|\n*]*('|"").*\3)[\s\n]*)*href[ ]*=[ ]*('|"")(?<link>.*)\4[.\n]*>(?<anchor>[\s\S]*?)[\s\n]*<\/[\s\n]*a>",
"[${link} ${anchor}]");
}
else
{
return articleBody;
}
}