所以我有一个正则表达式,它将查看一个字符串并匹配所有相对锚链接,如: Leaderboard
它与href以HTTP或HTTPS开头的位置不匹配。
表达式是:
<a.*?href="([^http]|[^https]).*?"[^<]
这部分现在很好。
然而,在我得到匹配后,我似乎无法弄清楚我想用routerLink替换href名称。
此:
<a href="/leaderboard">Leaderboard</a>
变为:
<a routerLink="/leaderboard">Leaderboard</a>
注意href现在是routerLink。
有20多场比赛,所以我不能简单地用排行榜替换我需要保持相对路径相同。从字面上看,匹配字符串中唯一被替换的是routerLink的href,该属性的值保持不变。
这部分给了我一个问题!
这里有什么想法吗?
由于
答案 0 :(得分:3)
虽然其他帖子已经已接受,但我想在没有正则表达式的情况下发布an alternative
Expression
Linq查询也可用于相同的 XPath
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
foreach(var a in doc.DocumentNode.SelectNodes("//a[@href]"))
{
var href = a.Attributes["href"];
href.Remove();
a.Attributes.Add("routerLink", href.Value);
}
var newHtml = doc.DocumentNode.OuterHtml;
答案 1 :(得分:0)
您的模式并没有按照您的想法行事 - 如果您的模式href="halfway"
,会发生什么。你说的模式
<a.*?href="([^http]|[^https]).*?"[^<]
分解为:
<a
。.*?
以匹配href="
h
,t
,t
,p
或h
之一,t
的字符,t
,p
,s
。 ([^http]|[^https])
- 请注意,方括号[
,]
中的字符列表代表一个匹配的字符。.*?
以匹配"
<
虽然这个在线网站不会处理所有.Net正则表达式,但它会显示问题并解释一些匹配操作的工作原理:https://regex101.com/r/raoCcA/1
这应该有效:
var pattern = @"href=(?=""(?!http|https))";
var ans = Regex.Replace(src, pattern, "routerLink=");
如果需要,您可以尝试限制href
个a
标记,但是对于正则表达式来说它开始变得太复杂了:
var pattern = @"(?<=<a([^<>]|<!--|-->)+)href=(?=""(?!http|https))";