突出显示整个单词,省略HTML

时间:2009-08-23 18:51:49

标签: c# regex string

我正在编写一些C#代码来解析RSS提要并突出显示内容中的特定整个单词,但是,我只需要突出显示HTML之外的单词。到目前为止,我有:

string contentToReplace = "This is <a href=\"test.aspx\" alt=\"This is test content\">test</a> content";

string pattern = "\b(this|the|test|content)\b";

string output = Regex.Replace(contentToReplace, pattern, "<span style=\"background:yellow;\">$1</span>", RegexOptions.Singleline | RegexOptions.IgnoreCase);

这样可以正常工作,除非它会在alt标签中突出显示“test”。我可以轻松编写一个剥离HTML的函数,然后进行替换,但我需要保留HTML来显示内容。

3 个答案:

答案 0 :(得分:2)

如果输入是有效的XHTML / XML,您可以将其解析为树结构(DOM / XLinq),递归遍历树,替换文本节点中的所有关键字出现,最后将树结构序列化为字符串。 / p>

未经测试的伪代码:

XNode Highlight(XElement element, List<string> keywords)
{
    var result = new XElement(element.Name);
    // copy element attributes to result

    foreach (var node in element)
    {
        if (node.Type == NodeType.Text)
        {
            var value = node.Value;
            // while value contains keyword
            // {
            //      add substring before keyword in value to result
            //      add new XElement with highlighted keyword to result
            //      remove consumed substring from value
            // }
        }
        else if (node.Type == NodeType.Element)
        {
            result.Add(Highlight((XElement)node, keywords));
        }
        else
        {
            result.Add(node);
        }
    }

    return result;
}

var output = Highlight(XElement.Parse(input), new List<string> {...}).ToString();

答案 1 :(得分:1)

另一种解决方案,如果您有有效的XML但不想解析它:首先将输入字符串拆分为多个部分,使每个部分只包含一个标记或文本,但不包含两者。例如:

"This is ",
"<a href=\"test.aspx\" alt=\"This is test content\">",
"test"
"</a>"
" content"

然后遍历各个部分并仅将您的正则表达式应用于不以'<'开头的字符串。最后,将所有部分连接回一个字符串。

答案 2 :(得分:-2)

这是一个基本的。

private void Form1_Load(object sender, EventArgs e)
    {
        string contentToReplace = "This is <a href=\"test.aspx\" alt=\"This is test content\"> hello test world</a> content";

        string pattern = @"(>{1}.*)(test)(.*<{1})";

        string output = Regex.Replace(contentToReplace, pattern, "$1<span>$2</span>$3", RegexOptions.Singleline | RegexOptions.IgnoreCase);

        //output is :
        //This is <a href="test.aspx" alt="This is test content"> hello <span>test</span> world</a> content


        MessageBox.Show(output);
        Close();
    }