本帖最后由 moths 于 2011-02-16 10:31:22 编辑

解决方案 »

  1.   

    中文 英文 数字 混合判断
    还要判断html标签,还要注意标签嵌套的问题,
    有点难度
    要代码 40分 少了点
      

  2.   

    去看下带HTML标记的字符串截取,原理一样
      

  3.   

    以下代码 测试通过
    <?PHP
    header('Content-Type: text/html; charset=gbk');$str =<<<eof
    ㈥现㈣在有一篇文章㈩,然后我想把<font color="#ff0000"><a href="xxx">asd</a></font>这篇文章内插入广告代码,<div><font color="#ff0000"><a href="xxxyyy">这个代码</a></font></div>每隔800字节添加一段广告代码。<img =src="xxxxx">文章中含有若干html标签,<div><img =src="xxxxx"></div>位置不能确定,广告代码不能插入到标签之间,如果插入广告<div><img =src="xxxxx"> sdfdd</div>代码处正好遇到html标签,就将广告代码插入<div><img =src="xxxxx"></div>位置往后移动,直至不在html标签中为止。<div><img =src="xxxxx"></div>请问代码该怎么实现呢?<a href="xxxxx">昨天</a>下了一场大雪。<img src="../img/xx.jpg">这是一张图⑩片②。希望大家能给予帮助,谢谢!
    eof;$exa = array('㈠','㈡','㈢','㈣','㈤','㈥','㈦','㈧','㈨','㈩');
    $exb = array('①','②','③','④','⑤','⑥','⑦','⑧','⑨','⑩');
    $str = str_replace($exa,'',$str);
    $str = str_replace($exb,'',$str);$gg = '<script src="xxxx"></script>'; //要加的广告字符
    $max = 50 ;//设置截取长度
    $all = mb_strlen($str,'gbk') ;
    $p = ceil($all /$max) ; //计算出要分成几个部分if(preg_match_all('/(?:<(?!img)[^>]+>)+.*?(?:<\/\w+>)+/is',$str,$match)){
      foreach($match[0] as $k=>$v){
        $str = str_replace($v ,$exa[$k],$str);
      }
    }
    if(preg_match_all('/<img[^>]*>/is',$str,$mat)){
      foreach($mat[0] as $k=>$v){
        $str = str_replace($v ,$exb[$k],$str);
      }
    }if($all < $max ){
      $out = $str . $gg ;
      echo $out ;
    }else{
      $out = '';
      $i = 0 ;
      while($i < $p){
        if(($tp = mb_substr($str,$max * $i,$max,'gbk'))!=''){
          $out .= $tp . $gg ;
        }else{
          break ;
        }
        $i++ ;
      }  if(!empty($match[0])){
        foreach($match[0] as $k=>$v){
          $out = str_replace($exa[$k],$v,$out);
        }
      }
      if(!empty($mat[0])){
        foreach($mat[0] as $k=>$v){
          $out = str_replace($exb[$k],$v,$out);
        }
      }
      echo $out ;
    }?>
      

  4.   

    这段代码的特点是:兼容中文英文数字bg2312/gbk/编码,修改参数mb_strlen(,,,'utf-8'),mb_substr(,,,'utf-8')可支持utf-8编码考虑了html代码的嵌套和对称性以及<img>的不对称性。不会出现乱码但有一个缺陷,就是html代码出现的次数须小于10,如果需要支持大于10的情况,需要修改代码。
      

  5.   

    以下代码 测试通过,无html标签个数限制。
    代码有些臃肿,好多重复的功能没有做成函数,这个你自己改一下吧。$str =<<<eof
    ㈥现㈣在有一篇文章㈩,然后我想把<font color="#ff0000"><a href="xxx">asd</a></font>这篇文章内插入广告代码,<div><font color="#ff0000"><a href="xxxyyy">这个代码</a></font></div>每隔800字节添加一段广告代码。<img =src="xxxxx">文章中含有若干html标签,<div><img =src="xxxxx"></div>位置不能确定,广告代码不能插入到标签之间,如果插入广告<div><img =src="xxxxx"> sdfdd</div>代码处正好遇到html标签,就将广告代码插入<div><img =src="xxxxx"></div>位置往后移动,直至不在html标签中为止。<div><img =src="xxxxx"></div>请问代码该怎么实现呢?<a href="xxxxx">昨天</a>下了一场大雪。<img src="../img/xx.jpg">这是一张图⑩片②。
    希望大家能给予帮助,谢谢!
    ㈥现㈣在有一篇文章㈩,然后我想把<font color="#ff0000"><a href="xxx">asd</a></font>这篇文章内插入广告代码,<div><font color="#ff0000"><a href="xxxyyy">这个代码</a></font></div>每隔800字节添加一段广告代码。<img =src="xxxxx">文章中含有若干html标签,<div><img =src="xxxxx"></div>位置不能确定,广告代码不能插入到标签之间,如果插入广告<div><img =src="xxxxx"> sdfdd</div>代码处正好遇到html标签,就将广告代码插入<div><img =src="xxxxx"></div>位置往后移动,直至不在html标签中为止。<div><img =src="xxxxx"></div>请问代码该怎么实现呢?<a href="xxxxx">昨天</a>下了一场大雪。<img src="../img/xx.jpg">这是一张图⑩片②。
    希望大家能给予帮助,谢谢!
    ㈥现㈣在有一篇文章㈩,然后我想把<font color="#ff0000"><a href="xxx">asd</a></font>这篇文章内插入广告代码,<div><font color="#ff0000"><a href="xxxyyy">这个代码</a></font></div>每隔800字节添加一段广告代码。<img =src="xxxxx">文章中含有若干html标签,<div><img =src="xxxxx"></div>位置不能确定,广告代码不能插入到标签之间,如果插入广告<div><img =src="xxxxx"> sdfdd</div>代码处正好遇到html标签,就将广告代码插入<div><img =src="xxxxx"></div>位置往后移动,直至不在html标签中为止。<div><img =src="xxxxx"></div>请问代码该怎么实现呢?<a href="xxxxx">昨天</a>下了一场大雪。<img src="../img/xx.jpg">这是一张图⑩片②。
    希望大家能给予帮助,谢谢!
    eof;$exa = array('㈠','㈡','㈢','㈣','㈤','㈥','㈦','㈧','㈨','㈩');
    $exb = array('①','②','③','④','⑤','⑥','⑦','⑧','⑨','⑩');
    $str = str_replace($exa,'',$str);
    $str = str_replace($exb,'',$str);
    $char = 'gbk'; //设置字符编码
    $gg = '<script src="xxxx"></script>'; //要加的广告字符
    $max = 50 ;//设置截取长度
    $all = mb_strlen($str,$char) ;
    $p = ceil($all /$max) ; //计算出要分成几个部分if(preg_match_all('/(?:<(?!img)[^>]+>)+.*?(?:<\/\w+>)+/is',$str,$match)){
      foreach($match[0] as $k=>$v){
        $sk = str_split($k);
        $sexa = '';
        foreach($sk as $sv){
          $sexa .= $exa[$sv] ;
        }
        $str = str_replace($v ,$sexa,$str);
      }
    }
    if(preg_match_all('/<img[^>]*>/is',$str,$mat)){
      foreach($mat[0] as $k=>$v){
        $sk = str_split($k);
        $sexb = '';
        foreach($sk as $sv){
          $sexb .= $exb[$sv] ;
        }
        $str = str_replace($v ,$sexb,$str);
      }
    }if($all < $max ){
      $out = $str . $gg ;
      echo $out ;
    }else{
      $out = '';
      $i = 0 ;
      while($i < $p){
        $ii = 0 ;
        while(($tp = mb_substr($str,$max * $i + $ii,$max,$char))!=''){
          if(!in_array(mb_substr($tp,0,1,$char),$exa) && !in_array(mb_substr($tp,0,1,$char),$exb)){
            $out .= $tp . $gg ;
            break;
          }else{
            $ii++ ;
          }
        }
        $i++ ;
      }  if(!empty($match[0])){
        arsort($match[0]);
        
        foreach($match[0] as $k=>$v){
          $sk = str_split($k);
          $sexa = '';
          foreach($sk as $sv){
            $sexa .= $exa[$sv] ;
          }
          $out = str_replace($sexa,$v,$out);
        }
        
      }
      if(!empty($mat[0])){
        arsort($mat[0]);
        foreach($mat[0] as $k=>$v){
          $sk = str_split($k);
          $sexb = '';
          foreach($sk as $sv){
            $sexb .= $exb[$sv] ;
          }
          $out = str_replace($sexb,$v,$out);
        }
      }
      echo $out ;
    }