我需要替换span
id="comment_n"
n
的所有出现,其中span
可以是任意数字,并且此符合条件的span
的任何出现都可以嵌套。每个foo <span id="comment_1">text <span id="comment_2" attr="value">text.</span></span> bar
可以具有不同的属性。例如:
<span id="comment_\d+.+?<\/span>
我有这个正则表达式:
span
但它不包括最后一个结束Regex.Replace(input, regex, string.Empty, RegexOptions.Multiline | RegexOptions.IgnoreCase);
标记。
我需要做一个替换:
TableRoom
- NoRoom
- Status
答案 0 :(得分:2)
我建议使用HtmlAgilityPack来获取所需内容。您可以指定XPath以仅获取具有<span>
属性的id
标记,该属性以comment_
开头(不区分大小写),然后将其删除。使用正则表达式或不使用正则表达式可以对comment_
后的数字进行额外检查。这是一种删除某些具有特定属性值的标记的方法,其中使用正则表达式检查此值。
public string HtmlAgilityPackRemoveTagsWithSpecificAttribute(string html, string xpath, string attribute_name, Regex rx)
{
HtmlAgilityPack.HtmlDocument hap;
Uri uriResult;
if (Uri.TryCreate(html, UriKind.Absolute, out uriResult) &&
uriResult.Scheme == Uri.UriSchemeHttp)
{ // html is a URL
var doc = new HtmlAgilityPack.HtmlWeb();
hap = doc.Load(uriResult.AbsoluteUri);
}
else
{ // html is a string
hap = new HtmlAgilityPack.HtmlDocument();
hap.LoadHtml(html);
}
var nodes = hap.DocumentNode.SelectNodes(xpath);
if (nodes != null)
{
foreach (var node in nodes)
{
if (rx.IsMatch(node.Attributes[attribute_name].Value))
node.ParentNode.RemoveChild(node);
}
}
return hap.DocumentNode.OuterHtml;
}
你可以像这样使用它:
var res = HtmlAgilityPackRemoveTagsWithSpecificAttribute(html,
"//span[starts-with(translate(@id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'), 'comment_')]", "id",
new Regex("(?i)^comment_[0-9]+$"));
请注意,translate
用于启用不区分大小写的比较(comment_
,COMMENT_
等)。如果您不需要,只需使用starts-with(@id, 'comment_')]"
。
如果你多次使用它,可以在传递给方法之前实例化正则表达式,或者使用静态Regex.IsMatch
并替换方法签名。
答案 1 :(得分:-1)
至于为什么它不包含最后一个结束span
标记,这是因为你的正则表达式模式中的?
,这使得它“懒惰”导致它要匹配最短的满意字符串,如果删除它,匹配将包含最后一个'span'标记:
<span id="comment_\d+.+<\/span>
但我建议使用HtmlAgilityPack来解析你的DOM并对其进行操作。