搜索并替换非HTML内容

时间:2009-07-24 20:59:11

标签: c# html string

我需要编写一些代码来搜索和替换HTML标记之外的字符串中的整个单词。所以,如果我有这个字符串:

string content = "the brown fox jumped over <b>the</b> lazy dog over there";
string keyword = "the";

我需要像:

if (content.ToLower().Contains(keyword.ToLower()))
       content = content.Replace(keyword, String.Format("<span style=\"background-color:yellow;\">{0}</span>", keyword));

但我不想替换粗体标签中的“the”或“there”中的“the”,只是第一个“the”。

4 个答案:

答案 0 :(得分:1)

你可以使用this库来解析你的HTML并只替换任何html中没有的单词,只替换单词“the”而不是“three”使用RegEx.Replace(“\” s +“...”而不是字符串替换

答案 1 :(得分:0)

试试这个:

content = RegEx.Replace(content, "(?<!>)" 
   + keyword 
   + "(?!(<|\w))", "<span blah...>" + keyword + '</span>';

编辑:我修复了“这些”案例,但不是多于关键字用HTML包装的情况,例如“fox jumped over懒惰的狗。“

使用RegEx和普通的日常HTML,你要求的几乎是不可能的,因为要知道你是否在“内部”标签,你必须“配对”每个开始和结束标签,并且忽略意图自动关闭的标签(例如BR和IMG)。

如果这仅仅是网站的眼睛,我建议采用另一种方法:修复您的CSS,以便SPAN只添加影响标记之外的HTML。

例如:

content = content.Replace("the", "<span class=\"highlight\">the</span>");

然后,在你的CSS中:

span.highlight { background-color: yellow; }

b span.highlight,
i span.highlight,
em span.highlight,
strong span.highlight,
p span.highlight,
blockquote span.highlight { background: none; }

只需为每个HTML标记添加一个排除项,其内容不应突出显示。

答案 2 :(得分:0)

我喜欢使用HTML解析器的建议,但是让我提出一种枚举顶级文本(无封闭标签)区域的方法,您可以在闲暇时进行转换和重组。

基本上,您可以将每个顶级开放标记视为{,并跟踪仅该标记的嵌套。与您想要自己进行的常规解析相比,这可能很简单。

以下是一些潜在的问题:

如果它不是XHTML,则需要一个始终为空的标记列表:

<hr> , <br> and <img> (are there more?).

对于所有开场代码,如果它以/&gt;结尾,则立即关闭 - {}而不是{。

不区分大小写 - 我相信你会想要不敏感地匹配标签名称(只是lc all)。

超级宽松的浏览器解释,如

"<p> <p>" = "<p> </p><p>" = {}{ 

不允许引用的实体包含&lt;&gt; (他们需要使用&amp; lt;),但也许浏览器也是超级允许的。

基本上,如果你想解析正确的 HTML标记,那就没问题了。

所以,算法:

“上一个标记的结尾”=字符串的开头

重复搜索下一个开放标记(不区分大小写)或字符串结尾:

< *([^ >/]+)[^/>]*(/?) *>|$

句柄(上一个标记的结尾,匹配开始)作为所有标记之外的区域。

设置tagname = lc($ 1)。如果有/($ 2不为空),则更新结束并在开始时继续。否则,深度= 1,

  1. 深度&gt; 0,扫描下一个(也不区分大小写):

    &LT; *(/?)* $ tagname *(/?)*&gt;

    如果是$ 1,那么它是一个关闭标签(depth- = 1)。否则,如果不是2美元,它是另一个开放标签;深度+ = 1。在任何情况下,请保持循环(返回1。)

  2. 回到开始(你又回到了顶级)。请注意,我在顶部说“扫描顶级开放标记的下一个开始,或字符串结尾”,即确保处理挂在最后一个结束标记上的顶层文本。

    就是这样。基本上,你可以忽略所有其他标签,而不是你正在监控的当前最顶层的标签,假设输入标记是正确嵌套的(它仍然可以正常地对抗某些类型的错误嵌套)

    此外,无论我在哪里写过上面的空格,都应该是任何空格(在&lt;&gt; /和标记名之间,你可以允许任何你喜欢的空格)。

    正如您所看到的,仅仅因为问题比完整的HTML解析稍微容易一些,并不一定意味着您不应该使用真正的HTML解析器:)您可能会搞砸很多。

答案 3 :(得分:-2)

您需要提供更多详细信息。

例如:

<p>the brown fox</p>

技术上是在HTML标记内。