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

时间:2015-09-25 22:00:46

标签: c# html

我有一串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.

字符串&#34;魔术&#34;在中间是自由浮动的,我会得到这个:

This is a <a href="/link.html">crazy <a href="/link.html">magic</a> stuff</a> word

采用这种方法的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

我不确定你是如何解析你的字符串或DOM的,但它相当简单。只要您遇到<a,就会跳过所有内容,直到遇到</a>,然后继续解析并替换您的单词。您可以这样做,因为您无法在链接中找到链接。

如果我理解正确的话,要将您的文字作为链接,您只需在每个单词后关闭a标记即可。

答案 1 :(得分:0)

当然这应该从不用于解析HTML,但是如果你需要用String替换方法实现你所描述的内容,那么如下所示呢?

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,例如,这不起作用。我们假设这是针对您建议的非常简单的情况。

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