正则表达式替换字符串但不在html标记内

时间:2009-07-21 11:29:57

标签: javascript html regex

我想使用JavaScript替换HTML页面中的字符串但忽略它,如果它在HTML标记中,例如:

<a href="google.com">visit google search engine</a>
you can search on google tatatata...

我想将google替换为<b>google</b>,但不是取代:

<a href="google.com">visit google search engine</a>
you can search on <b>google</b> tatatata...

我试过这个:

regex = new RegExp(">([^<]*)?(google)([^>]*)?<", 'i');
el.innerHTML =  el.innerHTML.replace(regex,'>$1<b>$2</b>$3<');

但问题是:我在<b>google</b>代码中获得了<a>

<a href="google.com">visit <b>google</b> search engine</a>
you can search on <b>google</b> tatatata...

如何解决这个问题?

9 个答案:

答案 0 :(得分:6)

你最好使用html解析器而不是正则表达式。我不确定它是否可以100%可靠地完成。

答案 1 :(得分:5)

您可能会或可能不会使用正则表达式。这取决于您可以精确定义条件。说你想要更换字符串,除非它在HTML标签中的范围不够窄,因为页面上的所有内容都可能在某些HTML标记内(如果没有其他内容则为BODY)。

为此遍历DOM树可能会更好,而不是尝试在HTML上使用正则表达式。

答案 2 :(得分:1)

你真的不能那样做,你的“谷歌”总是在某个标签中,要么全部替换,要么全部没有

答案 3 :(得分:1)

使用正则表达式解析HTML对于除了微不足道的情况之外的任何事情都不容易,因为 HTML不是常规的

有关详细信息,请参阅this Stackoverflow question(和答案)。

答案 4 :(得分:1)

我想你们都错过了这个问题......

当他在标签内部说出来时,他意味着在开始标签内部,就像在&lt; a href =“google.com”&gt;中一样。 tag ...这是与文本完全不同的东西,例如,在&lt; p&gt;内。 &LT; / p为H.标签对或&lt; body&gt; &LT; /体取代。虽然我还没有答案,但我正在努力解决同样的问题,我知道它必须能够使用正则表达式来解决。一旦我搞清楚,我会回来发布。

答案 5 :(得分:1)

解决方法

如果你不能使用html解析器或对你的html结构非常有信心,试试这个:

  1. 做“坏”改变
  2. 重复替换(&lt; [^&gt;] *)(&lt; [^&gt;] +&gt;)几次到$ 1(尽可能多)
  3. 这是一个简单的解决方法,但对我有用。

    缺点? 嗯......你必须为这个案子做两次替换...... ...&gt;因为它只从页面上的每个标签中删除第一个不需要的标签

    [编辑:] 的

    为什么不使用jQuery,将html代码放入页面并执行以下操作:

    $(containerOrSth).find('a').each(function(){
     if($(this).children().length==0){
     $(this).text($(this).text().replace('google','evil')); 
     }else{
     //here You have to care about children tags, but You have to know where to expect them - before or after text. comment for more help
     }
    });
    

答案 6 :(得分:0)

好吧,因为一切都是标签的一部分,所以你的要求没有任何意义。如果它只是<a />标记,您可能只是检查该部分。主要是确保在新</a>

之前没有拖尾<a>标记

答案 7 :(得分:0)

您可以使用REGEX执行此操作,但过滤块(如STYLE,SCRIPT和CDATA)需要更多工作,而不是在以下解决方案中实现。

大多数答案都说'你的数据总是在某些标签中',但它们缺少这一点,数据总是在某些标签之间“,你想过滤它在标签中的位置。” / p>

请注意,内联脚本中的标记字符可能会破坏它,因此如果它们存在,则应使用此方法单独处理它们。看看这里:
complex html string.replace function

答案 8 :(得分:0)

我正在使用 regex = new RegExp("(?=[^>]*<)google", 'i');