【问题标题】:Regular expression- add target="blank" to all <a> tag links in my content正则表达式 - 将 target="blank" 添加到我的内容中的所有 <a> 标记链接
【发布时间】:2011-02-17 22:12:20
【问题描述】:

有人可以帮我在 C#.net 中创建一个正则表达式,以将 target="_blank" 添加到我的内容中的所有 &lt;a&gt; 标记链接吗?

如果链接已经设置了目标,则将其替换为"_blank"。目的是在新窗口中打开我的内容中的所有链接。

感谢您的帮助

-dotnet 岩石

【问题讨论】:

  • dotnetrocks,但是用正则表达式解析 html 不stackoverflow.com/questions/1732348/…
  • 查看specification for XML,对于有效的 XHTML 输入,此任务可能是可能的。但它会看起来很丑。
  • 一个简单的正则表达式可能会在 cmets 和 CDATA 区域内匹配,这对您来说可能是也可能不是问题。这些复杂性是为什么在 Stack Overflow 上通常会获得某个链接作为“使用正则表达式解析 HTML”问题的答案的原因。

标签: c# regex


【解决方案1】:

有很多关于not to use regex when parsing HTML 的提及,因此您可以使用Html Agility Pack

HtmlDocument document = new HtmlDocument();
document.LoadHtml(yourHtml);

var links = document.DocumentNode.SelectNodes("//a");
foreach (HtmlNode link in links)
{
    if (link.Attributes["target"] != null)
    {
        link.Attributes["target"].Value = "_blank";
    }
    else
    {
        link.Attributes.Add("target", "_blank");
    }
}

这将添加(或在必要时替换)target='_blank' 到您文档中的所有锚点。

【讨论】:

  • 然后使用 var newHtml = document.DocumentNode.OuterHtml;
【解决方案2】:
RegEx.Replace(inputString, "<(a)([^>]+)>", "<$1 target=""_blank""$2>")

它也会在那些已经存在目标的锚标签中添加目标

【讨论】:

  • 不错的解决方案。我刚刚将正则表达式更改为以下内容: RegEx.Replace(input, "]+)>", "");唯一的变化是我在正则表达式替换的双引号之前使用了转义,否则我会得到编译错误。
  • 这不会搞砸所有其他以a开头的标签吗? ,即。如果您仍然要添加目标属性,为什么还要费心寻找标签的关闭? RegEx.Replace(inputString, "
  • 我按顺序想出了两个正则表达式来实现这一点。注意 - 我正在使用 JS。如果存在则删除目标result = result.replace(/(&lt;a [^&gt;]*)(target="[^"]*")([^&gt;]*&gt;)/gi, '$1$3');,添加新目标=“_blank”result = result.replace(/(&lt;a [^&gt;]*)(&gt;)/gi, '$1 target="_blank"$2');
【解决方案3】:

我使用与 Alex 所展示的方法类似的扩展方法来做到这一点。方法:

// Return the input string with all parsed HTML links having the "target" attribute set to specified value
// Links without a target attribute will have the attribute added, existing attributes values are updated
public static string SetHtmlLinkTargetAttribute(this string inputHtmlString, string target)
{
    var htmlContent = new HtmlDocument();
    htmlContent.LoadHtml(inputHtmlString);

    // Parse HTML content for links
    var links = htmlContent.DocumentNode.SelectNodes("//a");
    foreach (var link in links)
    {
        link.SetAttributeValue("target", target);
    }

    return htmlContent.DocumentNode.OuterHtml;
}

并用它来清理我的链接:

// Enforce targets for links as "_blank" to open in new window
asset.Description = asset.Description.SetHtmlLinkTargetAttribute("_blank");

【讨论】:

    【解决方案4】:
    RegEx.Replace(inputString, "<(a)([^>]+)>", "<$1 target=""_blank""$2>")
    

    【讨论】:

    • 很好的快速回答,但您没有考虑到 target="_blank" 或 target="something else" 已经在正则表达式中。需要考虑的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多