$sort['登山协会']  =  'http://www.8888.com';  
           $sort['登山']  =  'http://bbs.8888.com';  
           $sort['8888']  =  'http://www.8888.com';  
           $str  =  "登山的人和登山协会这是要做替换的一段文字.";  
           echo    '元字符串:'.$str.'<br>'  ;  
           foreach($sort  as  $k=>$v){  
                       $href  =  '';  
                       $href  =  "<a  href='".$v."'  target=_blank><font  color=red><b>".$k."</b></font></a>";  
           $str  =  preg_replace("/".$k."(?![^<>]*(<\/a>  &brvbar;>))/i",$href,$str);  
           }  
代码如上  
就是先处理"登山协会"然后处理"登山"  
结果是被处理过的"登山协会"被替换为<a>登山协会</a>  
但"登山协会"中含有"登山",  
当处理"登山"  的时候标签里面的(<a>登山协会</a>)也被处理了  
所以超级连接也被处理了,谁帮写个正则只让替换<a>标签外的关键字
高手指教,谢谢了

解决方案 »

  1.   

    $str = preg_replace("/".$k."(?![^<>]*(<\/a>|>))/i",$href,$str);
      

  2.   

    $sort['登山']  =  'http://bbs.8888.com';
    $sort['登山协会']  =  'http://www.8888.com';  
    $sort['8888']  =  'http://www.8888.com';
      

  3.   

    /(?!:<a[^>]+>)登山/自己动手改
    自己去查一下(?!:)以及(?=:)的用法,通过自己改就明白了
      

  4.   

    还有,没必要用foreach,preg_replace支持数组替换,请查手册
    注意数组的顺序比较重要
      

  5.   

    关键是弄不出来啊,楼上的帮我看看
    $sort['登山协会']  =  'http://www.8888.com';  
               $sort['登山']  =  'http://bbs.8888.com';  
               $sort['8888']  =  'http://www.8888.com';  
               $str  =  "登山的人和登山协会这是要做替换的一段文字.";  
               echo    '元字符串:'.$str.'<br>'  ;  
               foreach($sort  as  $k=>$v){  
                           $href  =  '';  
                           $href  =  "<a  href='".$v."'  target=_blank><font  color=red><b>".$k."</b></font></a>";  
               $str  =  preg_replace("/".$k."(?![^<>]*(<\/a>  &brvbar;>))/i",$href,$str);  
               }  
    代码如上  
    就是先处理"登山协会"然后处理"登山"  
    结果是被处理过的"登山协会"被替换为<a>登山协会</a>  
    但"登山协会"中含有"登山",  
    当处理"登山"  的时候标签里面的(<a>登山协会</a>)也被处理了,着问题很难解决的
      

  6.   

    http://community.csdn.net/Expert/topic/5579/5579546.xml?temp=.9090082
    这里有个相同的问题。
      

  7.   

    楼主的数组key竟然用 中文 佩服佩服 呵呵~
      

  8.   

    这个属性和内容都不替换,你看可以么?
    PHP的正则我不会用。。
    不过应该有类似的方法实现我那个replace的效果。。
    <script type="text/javascript">
    var strng = "上海市,上海等,<a 属性='上海等'>上海等<\/a>";
    var key = ["上海市", "上海"]
    var reg = new RegExp("(<a[^>]*>(?:.|\\n|\\r)+?<\\/a>)|(" + key.join("|") + ")", "ig");
    var j = strng.replace(reg, function (a, b, c) {
    return b ? a : "<a newURL>" + a + "<\/a>";
    });
    alert(j);
    </script>
      

  9.   

    <script type="text/javascript">
    var strng = "登山的人和登山协会这是要做替换的一段文字.";
    var key = ["登山协会", "登山", "8888"];
    var sort = []
    sort['登山协会'] = 'http://www.8888.com';
    sort['登山'] = 'http://bbs.8888.com';
    sort['8888'] = 'http://www.8888.com'; var reg = new RegExp("(<a[^>]*>(?:.|\\n|\\r)+?<\\/a>)|(" + key.join("|") + ")", "ig");
    var j = strng.replace(reg, function (a, b, c) {
    return b ? a : "<a href='" + sort[a] + "'><font color='red'>" + a + "<\/font><\/a>";
    });j = j.replace(reg, function (a, b, c) {
    return b ? a : "<a href='" + sort[a] + "'><font color='red'>" + a + "<\/font><\/a>";
    });j = j.replace(reg, function (a, b, c) {
    return b ? a : "<a href='" + sort[a] + "'><font color='red'>" + a + "<\/font><\/a>";
    });
    //你看我连续替换了3变也没出现问题啊只要<a>不出现嵌套还有不是很复杂(<[^>]用这个校验的不是很严谨不够应该足够了>
    alert(j);
    </script>
      

  10.   

    还是有问题啊 按照你那样做的话,被相同的关键字替换了
    其实我要的表达式只要忽略<a 属性>内容</a>标签<a>中的所有字符串就行,但是就是很难做到,辛苦你了,再帮看看吧,呵呵
      

  11.   

    不知你说什么,你测试我写的那个JS。。的code是不是想要的结果?
      

  12.   

    向 muxrwc 同学学习... :-)check it out
    =================
    <?php
    $sort['登山协会'] = 'http://www.8888.com';
    $sort['登山'] = 'http://bbs.8888.com';
    $sort['8888'] = 'http://www.8888.com';
    $str = "登山的人和登山协会这是要做替换的一段文字."; $href = '';
    $keyStr = implode('|',array_keys($sort));
    $str = preg_replace_callback("/(<a[^>]*>(?:.|\\n|\\r)+?<\\/a>)|(".$keyStr.")/i","Foo",$str);function Foo($matchs)
    {
    global $sort;
    $v = $sort[$matchs[2]];
    return "<a href='".$v."' target=_blank><font color=red><b>".$matchs[2]."</b></font></a>";
    }
    echo htmlspecialchars($str);
    ?>
      

  13.   

    T_T
    很感激的眼神看着你,清澈兄。这PHP看着迷糊啊
      

  14.   

    to muxrwc同学:
    :D
    不迷糊,比起javascript容易上手多啦....
      

  15.   

    呵呵
    谢谢了
    大家辛苦了
    特别鸣谢 foolbirdflyfirst(湖水清澈@Fix my lover@)
    对muxrwc(厕所宣言:信念永不变,追猫永不弃。) 也表示由衷的感谢
    还有lxcnn(过客)的鼎立帮助
    问题解决了
    谢谢大家,祝大家工作顺利,生活开心
    哈哈
    有空没空的都帮帮我 哈哈