修正一下上一篇文章中的错误:
代码如下:$value="http:www.domain1.com  [IMG]http:www.domain2.com[/IMG] http:www.domain3.com";$str = eregi_replace("http://([a-zA-Z0-9.-:?=&\-]*)","\\0",$value);这种形式会得到结果如下:http://www.domain1.com  [IMG]http://www.domain2.com[/IMG] [URL=http://www.domain3.com]http:www.domain3.com[/URL]而我希望得到的结果是:http://www.domain1.com  [IMG]http://www.domain2.com[/IMG] http://www.domain3.com";domain2和domain3的不予转换。
请问eregi_replace()里的正则表达式要怎么样写才好?我试了很久都搞不好。

解决方案 »

  1.   

    $value="http://www.domain1.com  [IMG]http://www.domain2.com[/IMG] http://www.domain3.com";echo $str = eregi_replace("^http://([a-zA-Z0-9.-:?=&\-]*)","\\0",$value);
      

  2.   

    试了,但这样如果内容这样的话:$value="[IMG]http://www.domain2.com[/IMG] http://www.domain3.com http://www.domain1.com";则domain1不会转化。
      

  3.   

    是的,不知你想干什么。
    或许你可能是需要匹配[/tag]、[tag]间的内容
      

  4.   

    我的想法是这样的,凡是内容中有:[IMG]link[/IMG]
    link的link就不转化,没有这两个标记的link就自动转化为link可以实现吗?
      

  5.   

    /* 此办法要求这三段之间必须要有一个非[,],=的分隔符
     如$value="http://www.domain1.com [IMG]http://www.domain2.com[/IMG] http://www.domain3.com";
     由于http://www.domain1.com之前什么都没有,所以不会替换,办法----追加一个空格或是其他字符到开头:)
     如:
     $value= ' '.$value;
     这办法比较老土,还望高人指点
    */
    //$value="[IMG]http://www.domain2.com[/IMG] http://www.domain3.com http://www.domain1.com";
    $value=" http://www.domain1.com [IMG]http://www.domain2.com[/IMG] http://www.domain3.com";
    $str = preg_replace('/[^\[\]\=](http:\/\/\w+(\.\w+)+)/','\\1',$value);
    print_r($str);
      

  6.   

    一种可能的写法:
    <?php
    $value="http://www.domain0.com[IMG]http://www.domain2.com[/IMG] http://www.domain3.com http://www.domain1.com";// 提取将要排除的标记
    preg_match_all("/\[(\w+).*\].+\[\/\\1\]/iU",$value,$regs);
    // 构造替换数组
    foreach($regs[0] as $k=>$v) {
      $p[$k] = "|".preg_quote($v)."|";
      $r[$k] = "`$k`";
    }
    // 替换掉要排除的标记
    $value = preg_replace($p,$r,$value);
    // 对余下的做替换
    $value = preg_replace("|http://([a-zA-Z0-9.-:?=&-]*)|i","\\0",$value);
    // 准备复原
    foreach($regs[0] as $k=>$v) {
      $p[$k] = "/$r[$k]/";
      $r[$k] = $v;
    }
    // 恢复要排除的标记
    $value = preg_replace($p,$r,$value);echo $value;
    ?>
      

  7.   

    试了唠叨大哥的这种做法,是可行的。但如果内容里面没有标记的话$value="http://www.domain0.com http://www.domain1.com";就会出现:
    Warning: Empty regular expression in D:\test.php on line 12的错误。
      

  8.   

    是呀,你需要做判断啦。
    没有标记时$regs[0]为空数组