我想把:<div id ="test">
    <code><?php echo "abc";?></code>
</div>替换成:<div id ="test">
    <code><?php phpinfo()?></code>
</div>版上问过高手://下面这句可以实现:
$html = preg_replace('#(?<=<code>)(.*)(?=</code>)#','<?php phpinfo();?>',$html);
//但是下面这两句为什么不行?
$html = preg_replace('#(?<=<code>)([.]*)(?=</code>)#','<?php phpinfo();?>',$html);
$html = preg_replace('#(?<=<code>)[.]*(?=</code>)#','<?php phpinfo();?>',$html);
//<code></code>标签内可能还有换行,我还想匹配换行,可下面还是不行:
$html = preg_replace('#(?<=<code>)[.\n]*(?=</code>)#','<?php phpinfo();?>',$html);正则菜鸟,请大侠指教。
BTW:正则前面和最后的#号是干什么的?

解决方案 »

  1.   

    $html = preg_replace('#(?<=<code>)([.]*)(?=</code>)#','<?php phpinfo();?>',$html);
    用[]括号的一点就是一点, 放在()中是指任意字符
      

  2.   

    $html = preg_replace('#(?<=<code>)(.*)(?=</code>)#s','<?php phpinfo();?>',$html);
      

  3.   

    这里的#表示正则的开始和结尾,一般是用/,这里用#只是为了避免为</code>中的/转义。
    (?<=<code>)表示以<code>为开头,(?=</code>)表示以</code>为结尾。
    第二个#后面加了模式修正符s就能使(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。 
      

  4.   

    更多正则相关可以看《PHP语法手册》和《正则表达式30分钟入门教程》
    http://deerchao.net/tutorials/regex/regex.htm
      

  5.   

    #是自定义的定界符,你可以把它替换成/,但是要把</code>中的转义,写为<\/code>
    第2句和第3句匹配失效是因为[]里面的字符时原始字符,你的[.]等同于\.
    第4句原理同上,如果要匹配换行符的话,同3楼所说,在修正符后面加上s即可