1、效率当然是正则越少越好;
2、
$str = "<a href='../aaa'>鲜花</a>";
$tip = urlencode(preg_replace("/<a.+href=.+>(.+)<\/a>/Usi","\\1",$str));
$str = preg_replace("/(<a.+href=')(.+)('>.+<\/a>)/Usi","\\1list.php?q=$tip\\3",$str);
echo $str;

解决方案 »

  1.   

    能不能一个preg_replace 搞定的?
      

  2.   

    <?phpecho preg_replace("/<a\shref=\'..\/[^\']*\'>([^<]*)<\/a>/",
    "<a href=list.php?q=".urlencode('\${1}').">\${1}</a>",
    "<a href='../aaa'>鲜花</a>");?>
      

  3.   

    使用preg_replace_callback或者preg_replace的参数e
      

  4.   

    to thunderx(平生一笑) 
    你的代码,如果只匹配一次还可以,如果匹配很多次的话就有问题了。to zhiin(稚鹰@南通):
    你的代码怎么不行,href=list.php?q=\${1}了to Gdj(陈水.智商只有129.非卖品) :
    我不太明白,你能说清楚一点吗?
      

  5.   

    你的是PHP5吗?如果不是, 这样:<?phpecho preg_replace("/<a\shref=\'..\/[^\']*\'>([^<]*)<\/a>/",
    "<a href=list.php?q=".urlencode('\\1').">\\1</a>",
    "<a href='../aaa'>鲜花</a>");?>
      

  6.   

    最好别用\${1}了。好象在一些PHP版本上这种用法不行。除非是当1后面有一个数字
      

  7.   

    我的php 是4.4 上边的这几种方式都不行
      

  8.   

    最好别用\${1}了。好象在一些PHP版本上这种用法不行。除非是当1后面有一个数字
    ---------------------------------    PHP5现在推荐用这种方法, 我用的很好啊~ 
    楼主这样试试:<?phpecho preg_replace("/<a\shref=\'..\/[^\']*\'>([^<]*)<\/a>/",
    "<a href=list.php?q=".urlencode('\1').">\\1</a>",
    "<a href='../aaa'>鲜花</a>");?>
    如果还不行, 这样:<?phpecho preg_replace("/<a\shref=\'..\/[^\']*\'>([^<]*)<\/a>/e",
    "<a href=list.php?q=".urlencode('\1').">\\1</a>",
    "<a href='../aaa'>鲜花</a>");?>再不行就用回调函数!
    如果还不行那我就无能为力了:(~~
      

  9.   

    终于搞定了.<?php
    $str = "<a href='../aaa'>鲜花</a><a href='../bbb'>礼品</a>";
    echo preg_replace("/<a\shref=\'..\/[^\']*\'>([^<]*)<\/a>/e","'<a href=list.php?q='.urlencode('$1').'>$1</a>'",$str);
    ?>大家的一些例子没有通过可能是因为php版本的问题.在此谢谢大家了.
      

  10.   

    to zhiin(稚鹰@南通):
    恩,虽然\${1}是PHP5里被推荐的,但是我在一些PHP版本比较旧的环境下测试,会出错。。
    我记得以前测试是4.1.x还是4.0.x了