中国中国<a href="www.c.com/中国" title="中国">中国<img src='' /></a>中国,求匹配链接外的中国比如把“中国替换成1”,结果是:11<a href="www.c.com/中国" title="中国">中国<img src='' /></a>1

解决方案 »

  1.   

    <script type="text/javascript">
    var a="中国中国<a href=\"www.c.com/中国\" title=\"中国\">中国<img src='' /></a>中国";
    var reg=/(中国)/g;
    var reg2=/<a.*>*<\/a>/g;
    var b=a.split(reg2);
    var c=a.match(reg2);
    var x="";
    for(var i=0;i<b.length;i++){
    b[i]=b[i].replace(reg,'1');
    x+=b[i];
    if(c[i]){
    x+=c[i];
    }
    }
    alert(x);
    </script>
    js没逆序环视 等高手吧
      

  2.   

    var reg=/中国(?!(?:"|<img))/g;
    str=str.replace(reg,'1');
      

  3.   

     
    str=str.replace(/(.*?)(<a[^>]+>.+?<\/a>)(.+?(?:(?=<a)|$))/g,function(_,a,b,d){
     return a.replace(/中国/g,'1')+b+ d.replace(/中国/g,'1')
    })
     
      

  4.   


    如果我改成这样:中国中国<a href="www.c.com/中国" title="a中国a">中国<img src='' /></a>中国
    就不行了,我想匹配链接外边的,就是<a></a>之间的全部不匹配,不管中间有任何代码
      

  5.   


    可惜JS正则不支持零宽度正回顾后发断言,实现起来复杂了些,不过还是可以实现的:var reg=/中国((?=.*<a\b)|(?!(?:"|.*?<\/a>)))/g;
      

  6.   

    /^中国|中国(?=<a.*?<\/a>)|中国$/g
      

  7.   

    说明:你的例子中的字符串s中既有双引号又有单引号,这样的字符串在运行时不存在,所以,我下面的例子中对单引号进行了转义。(否则不管s的最外层为单引号还是双引号都会有语法错误)<script>var s='中国中国<a href="www.c.com/中国" title="中国">中国<img src=\'\' /></a>中国,求匹配链接外的中国';
    var result1=s.replace(/<a/gim,"&");
    alert(result1);var result2=result1.replace(/中国(?![^&]*?<\/a>)/gim,"1");
    alert(result2);
    var result3=result2.replace(/&/gim,"<a");
    alert(result3);
    </script>
      

  8.   


    我就是用这个的这个,不过会把链接中的“中国替换掉”var s='中国中国<a href="www.c.com/中国123" title="中国">中国<img src="" /></a>中国,求匹配链接外的中国';
    /(中国)(?![^<a]*?<\/a>)/g
      

  9.   

    不知道你怎么用的,我帖出全部代码,此帖到此不再回复了:<html>
    <head>
    <script>
              var s='中国中国<a href="www.c.com/中国123" title="中国">中国<img src="" /></a>中国,求匹配链接外的中国';
              alert(s);
              var reg=/中国((?=.*<a\b)|(?!(?:"|.*?<\/a>)))/g;
              s=s.replace(reg,'1');
              alert(s);
           </script>
    <head>
    <html>
      

  10.   

    这个有问题哦(另外这是种治标不治本的思路,我们不能停留在特定的字符串上,而应该寻找解决这一类问题的方法),当把s换成s=s+s时就出问题了(这是由于模式匹配的前部分?=.*<a\b)决定的),测试代码如下
    <script>
     
     var s='中国中国<a href="www.c.com/中国123" title="中国">中国<img src="" /></a>中国,求匹配链接外的中国';
      s=s+s;
              alert(s);
              var reg=/中国((?=.*<a\b)|(?!(?:"|.*?<\/a>)))/g;   
              s=s.replace(reg,'1');
              alert(s);
           
    </script> 
    你怎么不用我的那个模式去做(我那多了个替换字符串的操作)?我的代码没问题。可能有些人不理解我的代码的想法,下面解释下:1.你要找到字符串"中国"的特点是什么,怎样判断是你要找的那个?
    首先,该贴问题是为了在字符串(s1)中找到 特定常量字符串s2("中国"),要求是s2不在某类元素中(<a </a>)。
    分析
    命题1 :s2不在a元素中 <=> s2在字符串中的位置状态不能为 's2(此处补充若干字符,但字符串中不能有“<a”)</a>  '
    注:  用模式表示即 /s2(?=[^(<a)]*?</a>/gm,注意这个模式字符串语法错误,我本意是想通过括号表示把“<a”看成一个字符,而在s2和</a>之间有若干个非“<a”的字符,如果这中语法成立,问题已经解决,但毕竟语法错误,因为[]中的字符是单独看待的(除了一些特殊的,如\,- 等,“(”会当作字符处理,起不到提高运算优先级的作用),既然“[]”中不能把一个字符串当作一个字符处理,没办法,只能替换成一个字符,所有我把字符串中的"<a"的替换成"&",这时侯/s2(?=[^&]*?</a>/gm的语法没问题了,同时他们的作用是一样的,最后把字符串中的&再替换回来,就ok。
    如果对前面的等价命题的真假不清楚,可以思考下面的它的逆否命题(相信对这个名词高中都学过),因为逆否命题和原命题的真假是一样的,有时候换种方式思考问题会显得简单。原命题的逆否命题:“中国”在元素a中,等价于在字符串的形式为 <a ***中国????</a>)(*、?为占位符,另外?不能为“<a”)
    在匹配时通过(?=pattern)过滤掉那些在元素a中的特定字符串(“中国”)
    有点乱!
      

  11.   

    另外把我上次的代码整理下(我在9楼的回复是为了测试分开写的),如下(思路可以作为这类问题的解决办法)
    alert(s.replace(/<a/gim,"&").replace(/中国(?![^&]*?<\/a>)/gim,"1").replace(reg,'1'));
      

  12.   

    靠,上面写错了
    alert(s.replace(/<a/gim,"&").replace(/中国(?![^&]*?<\/a>)/gim,"1").replace(/&/gim,"<a")); 
      

  13.   

    你这个只对这一个例子有效,如果我把Tag a改为img就失效了
      

  14.   


    没看懂你这个例子。
    但即使你把<a   </a>换成<image   />,问题的本质没变化。你要把我的所有模式中的"<a"替换为
    "<image" 把"/>",还是一样的效果。(申明如果你要找image,那办不到,就像你把贴子问题中的“中国”换成“a”,那样发生了本质的变化)。只是个简单的映射关系。
      

  15.   


    没看懂你这个例子。
    但即使你把<a   </a>换成<image   />,问题的本质没变化。你只要把我的所有模式中的"<a"替换为
    "<image" 把"</a>"替换成"/>",还是一样的效果。只是个简单的映射关系。(申明如果你要找image,那办不到,就像你把贴子问题中的“中国”换成“a”,那样发生了本质的变化)。透过现象看本质!
      

  16.   


    var str='中国中国<a href="www.c.com/中国" title="中国">中国<img src=\'\' /></a>中国,求匹配链接外的中国';
    str=str.replace(/(<[^>]*>|中国)/g,function(arg0){
    if(arg0=='中国'){
    return '1';
    }
    return arg0;
    });
    console.log(str);
      

  17.   

    我看到这个问题第一反应就是平衡组,这个用.net的正则很简单,js的有点麻烦看下面这个例子<div>中国(在div标签内,不能替换)<a href="www.c.com/中国123" title="中国">中国(都在a标签内无法替换)<img src="" /></a></div>中国(无外层标签,可替换)<span>求匹配链接外的中国(在span标签内,无法替换)</span><span>中国(因为无</span>,则认为它不在标签内,所以可以替换)