我需要编写一些代码来搜索和替换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”。
答案 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,
深度&gt; 0,扫描下一个(也不区分大小写):
&LT; *(/?)* $ tagname *(/?)*&gt;
如果是$ 1,那么它是一个关闭标签(depth- = 1)。否则,如果不是2美元,它是另一个开放标签;深度+ = 1。在任何情况下,请保持循环(返回1。)
回到开始(你又回到了顶级)。请注意,我在顶部说“扫描顶级开放标记的下一个开始,或字符串结尾”,即确保处理挂在最后一个结束标记上的顶层文本。
就是这样。基本上,你可以忽略所有其他标签,而不是你正在监控的当前最顶层的标签,假设输入标记是正确嵌套的(它仍然可以正常地对抗某些类型的错误嵌套)
此外,无论我在哪里写过上面的空格,都应该是任何空格(在&lt;&gt; /和标记名之间,你可以允许任何你喜欢的空格)。
正如您所看到的,仅仅因为问题比完整的HTML解析稍微容易一些,并不一定意味着您不应该使用真正的HTML解析器:)您可能会搞砸很多。
答案 3 :(得分:-2)
您需要提供更多详细信息。
例如:
<p>the brown fox</p>
技术上是在HTML标记内。