如何通过搜索/替换操作将超链接插入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

正确的方法是什么?

如何通过搜索/替换操作将超链接插入HTML中,而不会无意中嵌套链接

我不确定您是如何解析字符串或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,例如,这将不起作用。我们假设这是针对您建议的非常简单的场景。

如果这不是你想要的,请告诉我,我会编辑我的答案。