如何通过搜索/替换操作将超链接插入HTML中,而不会无意中嵌套链接
本文关键字:链接 嵌套 无意中 HTML 插入 搜索 何通过 替换 操作 超链接 | 更新日期: 2023-09-27 18:14:38
我有一个HTML字符串。里面是"魔法词",我需要用c#将其替换为链接。这是一个字符串替换操作,而不是DOM解析。所以…
This is a magic word.
…需要成为…
This is a <a href="/link.html">magic</a> word.
这是一个相当简单的替换操作,除了,如果这个词已经在输入中被链接了,我该怎么办?如果这是我的输入:
This is a <a href="/link.html">magic</a> word.
我以这个结尾:
This is a <a href="/link.html"><a href="/link.html">magic</a></a> word.
这可能很容易绕过,通过搜索空格或括号或其他东西,但是这个呢:
This is a <a href="/link.html">crazy magic stuff</a> word.
字符串" magic "在中间是自由浮动的,我将得到这个:
This is a <a href="/link.html">crazy <a href="/link.html">magic</a> stuff</a> word
正确的方法是什么?
我不确定您是如何解析字符串或DOM的,但它相当简单。只要遇到<a
,您就跳过所有内容,直到遇到</a>
,然后继续解析并替换您的单词。你可以这样做,因为你不能在一个链接中有一个链接。
如果我理解正确的话,为了使你的单词成为链接,你只需要在每个单词之后关闭a
标签。
当然不应该使用来解析HTML,但是如果您需要用字符串替换方法实现您所描述的内容,那么使用下面的内容如何?
private static string Linkify(string phrase, string word)
{
int wordIndex = phrase.IndexOf(word);
int linkBeginIndex = phrase.IndexOf("<a");
int linkEndIndex = phrase.IndexOf("</a>");
if(linkBeginIndex == -1 || !(wordIndex > linkBeginIndex && wordIndex < linkEndIndex))
{
phrase = phrase.Replace(word, String.Format("<a href='/link.html'>{0}</a>", word));
}
return phrase;
}
这里是DotNetFiddle的链接:https://dotnetfiddle.net/2e5Uh2
这不是一个灵活的实现,因为文本可能包含<a
,例如,这将不起作用。我们假设这是针对您建议的非常简单的场景。
如果这不是你想要的,请告诉我,我会编辑我的答案。