可能是病和毒兩個字的首尾字節剛好組成了你要取代的一個符號,我以前也遇到過類似的,你可以參考以下;
http://www.csdn.net/Expert/TopicView1.asp?id=1083826

解决方案 »

  1.   

    要不你用explode打开他们再连上.成不成.
      

  2.   

    <?php
    $a="《计算机病毒技术》";
    $b="’|“|”|,|。|、|《|$|#|℃|¥|§|*|》";
    preg_match_all("/[\\x80-\\xff]?./",$a,$arr);
    $a=implode(preg_replace("/$b/","",$arr[0]),"");
    echo "a=$a<br>";
    ?>
      

  3.   

    问题解决。
    多谢qiushuiwuhen(秋水无恨),也谢谢回答问题的各位网友
      

  4.   

    秋水的思路真是绝了!!!
    hehe,解释就由我来吧preg_match_all("/[\\x80-\\xff]?./",$a,$arr);
    中间[\\x80-\\xff]代表gb2312的高字节部分,?代表非贪婪模式,表示{0,1},这么模式就代表了一个字,包括双字节的汉字,然后通过preg_match_all将所有字分解到$arr[0]这个数组中了再然后通过preg_replace将数组中符合$b模式的字符替换为空,返回新数组,然后再合并新数组^_^
      

  5.   

    这里大虾真多啊!受益菲浅!
    再次谢谢qiushuiwuhen(秋水无恨),谢谢 vivanboy(☆☆☆☆☆)(★★★★★) 
      

  6.   

    呵。这是我笨人的笨方法。<?php
    $b="这是一本《计算机病毒技术》书籍";
    $b=eregi_replace('《(.+)》','\\1',$b);
    echo "$b<br>";
    ?>
      

  7.   

    $b="这是一本《计算机病毒技术》《计算机病毒技术》《计算机病毒技术》《计算机病毒技术》2002-9-11书籍";
    $b=preg_replace('/《(.+)》/U','\\1',$b);
    echo "$b<br>";
      

  8.   

    不好意思,上面解释刚好反了。
    应该是
    默认情况下是贪婪模式
    加上U才是非贪婪模式,非贪婪模式尽可能少的匹配所搜索的字符串?放在(*, +, ?, {n}, {n,}, {n,m})就是非贪婪模式
    单个?表示{0,1}