你没有理解正则里中括号[]的含义,[]里所有的东西匹配的时候只“消耗”单个字符。
除xxx之外的需求一般用“否定前瞻”(negative lookahead) 来实现。

解决方案 »

  1.   

    $str='[movie=http://a.com/a.mp3]';
    $ptn="/\[movie\=.*\.[^(mp3|wmv)]+\]/i"; if(preg_match($ptn,$str)) {
    echo 'Y';
    } else {
    echo 'N';
    }
      

  2.   

    <?php
    $str='[movie=http://a.com/a.mp3]';           //X格式为除了.mp3和.wmv以外的任何字符串
    $ptn="/\[movie\=.*(?<!mp3|wmv)]$/";
    $str=preg_replace($ptn,'x',$str);
    echo   $str; 
    ?>
      

  3.   

    <?php
    $str='[movie=http://a.com/a.mp3]';
    //$str='[movie=http://a.com/a.mp]';
    $ptn="/\[movie\=(?>.*\.)(?:(?!mp3|wmv).+)\]/";if(preg_match($ptn,$str,$g))   {
     echo   'Y';
     print_r($g);
    }   else   {
     echo   'N';
    }
    ?>