$str='<a href="http://item.taobao.com/item.htm?id=9694595974&ali_refid=a3_620362_1007:1102370186:7:46702465U84y78608587678s868v3I:7178ec8bae50aef3a187075f995ad009&ali_trackid=1_7178ec8bae50aef3a187075f995ad009" target="_blank"><img src="http://img01.taobaocdn.com/imgextra/i1/86719988/T20qpBXmFMXXXXXXXX_!!86719988.gif" border="0"></a><img title="" alt="" src="http://img02.taobaocdn.com/imgextra/i2/86719988/T2PdhIXmpbXXXXXXXX_!!86719988.gif" usemap="#elalakeMap" border="0"><map name="elalakeMap"><area shape="RECT" coords="1,1,22,22" href="http://fuwu.taobao.com/service/service.htm?service_id=347">';如以上字符串,将里面的超链接全部提取出来,如果此链接中有类似于 "id=9694595974"(其中id=后面的数字是系统自动生成的,而且数字后面跟的参数有时有 ,有时没有,如上例中的(&ali_refid=a3_620362_1007:1102370186:7:46702465U84y78608587678s868v3I:7178ec8bae50aef3a187075f995ad009&ali_trackid=1_7178ec8bae50aef3a187075f995ad009),可能有有可能没有),将此链接替换为go.php?id=9694595974,并将替换后的链接放回原处,如果原链接没有类似于"id=9694595974"的字符串,将此链接替换为”#“,并放回原处(此字符串中含有多个"id=9694595974"的超链接和多个不含"id=9694595974"的超链接),

解决方案 »

  1.   

    $str=<<<html
    <a href="http://item.taobao.com/item.htm?id=9694595974&ali_refid=a3_620362_1007:1102370186:7:46702465U84y78608587678s868v3I:7178ec8bae50aef3a187075f995ad009&ali_trackid=1_7178ec8bae50aef3a187075f995ad009" target="_blank"><img src="http://img01.taobaocdn.com/imgextra/i1/86719988/T20qpBXmFMXXXXXXXX_!!86719988.gif" border="0"></a><img title="" alt="" src="http://img02.taobaocdn.com/imgextra/i2/86719988/T2PdhIXmpbXXXXXXXX_!!86719988.gif" usemap="#elalakeMap" border="0"><map name="elalakeMap"><area shape="RECT" coords="1,1,22,22" href="http://fuwu.taobao.com/service/service.htm?service_id=347">
    <a href="http://item.taobao.com/item.htm?id=123456" target="_blank"><img src="http://img01.taobaocdn.com/imgextra/i1/86719988/T20qpBXmFMXXXXXXXX_!!86719988.gif" border="0"></a><img title="" alt="" src="http://img02.taobaocdn.com/imgextra/i2/86719988/T2PdhIXmpbXXXXXXXX_!!86719988.gif" usemap="#elalakeMap" border="0"><map name="elalakeMap"><area shape="RECT" coords="1,1,22,22" href="http://fuwu.taobao.com/service/service.htm?service_id=347">
    <a href="http://item.taobao.com/item.htm" target="_blank">aa</a>
    <a href="http://item.taobao.com/item.htm?name=key">aa</a>
    html;
    $str= preg_replace_callback('/<a\s+href="(.*?)"/s','foo',$str);
    echo $str; function foo($m){
         if(strpos($m[1],'id') !==false){
        preg_match('/id=(\d+)/i',$m[1],$ar);
            return  '<a href="go.php?id='.$ar[1].'"';
     }else{
            return '<a href="#"';  
     }  
     }
    <a href="go.php?id=9694595974" target="_blank"><img src="http://img01.taobaocdn.com/imgextra/i1/86719988/T20qpBXmFMXXXXXXXX_!!86719988.gif" border="0"></a><img title="" alt="" src="http://img02.taobaocdn.com/imgextra/i2/86719988/T2PdhIXmpbXXXXXXXX_!!86719988.gif" usemap="#elalakeMap" border="0"><map name="elalakeMap"><area shape="RECT" coords="1,1,22,22" href="http://fuwu.taobao.com/service/service.htm?service_id=347">
    <a href="go.php?id=123456" target="_blank"><img src="http://img01.taobaocdn.com/imgextra/i1/86719988/T20qpBXmFMXXXXXXXX_!!86719988.gif" border="0"></a><img title="" alt="" src="http://img02.taobaocdn.com/imgextra/i2/86719988/T2PdhIXmpbXXXXXXXX_!!86719988.gif" usemap="#elalakeMap" border="0"><map name="elalakeMap"><area shape="RECT" coords="1,1,22,22" href="http://fuwu.taobao.com/service/service.htm?service_id=347">
    <a href="#" target="_blank">aa</a>
    <a href="#">aa</a>
      

  2.   


    我用的是面向对象写的 ,貌似里面不支持这个函数啊,我是把foo放到一个静态方法中了,但是如果直接把foo换成静态方法 不行啊static function showdescurl($url){
     if(strpos($url[1],'id') !==false){
            preg_match('/id=(\d+)/i',$url[1],$ar);
            return  '<a href="go.php?id='.$ar[1].'"';
         }else{
            return '<a href="#"';     
         }  
    }
      

  3.   


    $str= preg_replace_callback('/<a\s+href="(.*?)"/s','code::showdescurl()',$str);
    其中“code::showdescurl()”的 code是类名,showdescurl()是静态方法
      

  4.   


    $str= preg_replace_callback('/<a\s+href="(.*?)"/s','code::showdescurl()',$str);
    其中“code::showdescurl()”的 code是类名,showdescurl()是静态方法
      

  5.   

    $str= preg_replace_callback('/<a\s+href="(.*?)"/s','code::showdescurl',$str);
      

  6.   

    回调函数 如果是类的方法的话,需要用数组形式传递
    array(类, 方法)
    示例class T {
      function parse($s) {
        echo preg_replace_callback('/(.)(.)/', array('T', 'foo'), $s); 
      }
      static function foo($r) {
        return $r[2].$r[1];
      }
    }$p = new T;
    $p->parse('abcd1234');