我想实现的功能是在一篇文章当中固定的正文字符长度之后添加广告:例如有一篇文章内容如下:<a href="http://baidu.com">我想测试</a>如果大海能<strong>挽回</strong>
我想实现在正文开始10个字符后添加广告:例如上面的这个正方用程序处理后的结果应当是:
<a href="http://baidu.com">我想测试</a>如果大海能<strong>挽[这里是广告代码]回</strong>
因为文章内容不是固定不变的所以想写一算法,请大家帮忙

解决方案 »

  1.   

    方法大概分析如下:你的正文是HTML代码和内容的混合体
    将正文看做成一个字符串,对这个字符串进行遍历,同时进行设置数字数的计数器
    设置一个开关变量,当碰到符号<时开关变量打开,当>时开关变量关闭
    当开关变量打开时字数计数器无效
    当字数计数器到达10时开始插入广告
      

  2.   

    <?php
    $strContent = $str; // 你的文章正文内容
    $strAd = "这里是广告内容"; // 广告内容
    $strBuffer = "";
    $strOutput = ""; // 输出内容
    $bCountSwitch = 0; // 计数器开关
    $iCount = 0; // 计数器
    $iStrLen = 0; // 字符串长度$iStrLen = strlen($strContent); // 得到正文长度,注意,由于包括中文(一个中文算两个字符),所以下面要分情况分析
    for($i=0; $i<$iStrLen; $i++){
    if($iCount==10){
    $strOutput = $strBuffer.$strAd.substr($strContent, $i, $iStrLen);
    break;
    } $strBuffer .= $strContent[$i];

    if($strContent[$i]=='<'){
    $bCountSwitch = 1;
    }

    if($strContent[$i]=='>'){
    $bCountSwitch = 0;
    }

    if($bCountSwitch==0){
    if(ord($strContent[$i])>127){
    $i++;
    $strBuffer .= $strContent[$i];

    }

    $iCount ++;
    }
    }// forif($iCount<10){
    $strOutput = $strContent.$strAd;
    }echo $strOutput;
    ?>
      

  3.   

    上面的有BUG,这个没问题<?php
    $strContent = $str; // 你的文章正文内容
    $strAd = "这里是广告内容"; // 广告内容
    $strBuffer = "";
    $strOutput = ""; // 输出内容
    $bCountSwitch = 0; // 计数器开关
    $iCount = 0; // 计数器
    $iStrLen = 0; // 字符串长度$iStrLen = strlen($strContent); // 得到正文长度,注意,由于包括中文(一个中文算两个字符),所以下面要分情况分析
    for($i=0; $i<$iStrLen; $i++){
    if($iCount==10){
    $strOutput = $strBuffer.$strAd.substr($strContent, $i, $iStrLen);
    break;
    } $strBuffer .= $strContent[$i];

    if($strContent[$i]=='<'){
    $bCountSwitch = 1;
    continue;
    }

    if($strContent[$i]=='>'){
    $bCountSwitch = 0;
    continue;
    }

    if($bCountSwitch==0){
    if(ord($strContent[$i])>127){
    $i++;
    $strBuffer .= $strContent[$i];

    }

    $iCount ++;
    }
    }// forif($iCount<10){
    $strOutput = $strContent.$strAd;
    }echo $strOutput;
    ?>
      

  4.   

    呵呵,我自己写了一个和大家分享一下,速度比二楼的朋友要快一点,欢迎大家指正不说了,发代码function insertAd($body)
    {
    //广告数组
    $ads = array();
    $ads[0]["len"] = "10";
    $ads[0]["str"]= "<script src='/plus/ad_js.php?aid=12' language='javascript'></script>";
    $ads[1]["len"] = "100";
    $ads[1]["str"]= "<script src='/plus/ad_js.php?aid=7' language='javascript'></script>";
    //暂时屏蔽所有标签
    $hiddenTag = preg_match_all("/(<.*?>)/i",$body,$match);
    $i=100;
    foreach($match[1] as $val)
    {
    $hiddenTag[$i] = $val;
    $body = str_replace($val,"@~{$i}~@",$body);
    $i++;
    }
    $length = mb_strlen($body,"utf-8");//字符长度
    $addLength = 0;//附加长度
    $bufferBody = "";//内容容器
    foreach($ads as $val)
    {
    $bufferBody_T = mb_substr($body,$addLength,$val["len"],"utf-8") . $val["str"];
    $split = preg_match_all("/@~\d*~@/",$bufferBody,$match);
    if($split)
    {
    $val["len"] = $val["len"] + ($split*8);
    $bufferBody_T = mb_substr($body,$addLength,$val["len"],"utf-8") . $val["str"];
    }
    $bufferBody .= $bufferBody_T;
    $addLength = $addLength + mb_strlen($val["str"],"utf-8");
    }
    //恢复所有标签
    $i=100;
    $length = count($hiddenTag);
    for($i=100;$i<$length;$i++)
    $bufferBody = str_replace("@~{$i}~@",$hiddenTag[$i],$bufferBody);
    }
    return $bufferBody;
    }
      

  5.   

    js实现如下
    如果php没有replace的handler的话.
    用js里的类似exec功能循环道理也是一样.
    <script type="text/javascript">
    var s = '<a href="http://baidu.com">我想测试</a>如果大海能<strong>挽回</strong>';var i = 0;
    var ad = '[这里是广告代码]';alert(
    s.replace(/<[^>]*>|([\s\S])/g, function (l, $1) {
    return l + ($1 && ++ i == 10 ? ad : '');
    })
    );
    </script>
      

  6.   

    楼上确实强大,我自己写了一个代码比较多,但兼容很好,分享给大家,是按照二楼的思路来的,实在想不出来什么好思路了,呵呵,抱歉
    function insertAd($body)
    {
    //广告数组
    $ads = array();
    $ads[0]["len"] = "2";
    $ads[0]["str"] = "<script src='/plus/ad_js.php?aid=12' language='javascript'></script>";
    $ads[1]["len"] = "3";
    $ads[1]["str"] = "<script src='/plus/ad_js.php?aid=7' language='javascript'></script>";

    $position = 0;
    $adsPos = 0;
    $container = "";
    $open = true;
    $open2 = true;
    $bodyLen = mb_strlen($body,"utf-8");
    for($i=0;$i<$bodyLen;$i++)
    {
    if($position == $ads[$adsPos]["len"])
    {
    $container .= $ads[$adsPos]["str"];
    $adsPos++;
    if(!isset($ads[$adsPos]))
    {
    $container .= mb_substr($body,$i,$bodyLen,"utf-8");
    break;
    }
    }
    $char = mb_substr($body,$i,1,"utf-8");
    //处理实体
    if($char == "&")
    {
    $nextChars = mb_substr($body,$i,10,"utf-8");
    if(preg_match("/(&([a-z]){2,};)/i",$nextChars,$match))
    {
    $t_len = mb_strlen($match[1],"utf-8");
    $i = $i + $t_len -1;
    $container .= $match[1];
    $position++;
    continue;
    }
    }
    $container .= $char;

    if($char == "<")
    {
    $open = false;
    $nextChar = mb_substr($body,$i+1,1,"utf-8");
    if(strtolower($nextChar) == "a")
    {
    $open2 = false;
    }
    continue;
    }
    if($char == ">")
    {
    if($open2 == false)
    {
    $preChar = mb_substr($body,$i-1,1,"utf-8");
    if(strtolower($preChar) != "a")
    {
    continue;
    }
    else
    {
    $open2 = true;
    }
    }
    $open = true;
    continue;
    }
    if($open && $open2)
    {
    $position++;
    }
    }
    return $container;
    }
    function mydede_replaceKeyword($body)
    {
    $body = insertAd($body);
    die($body);
    global $RenQiang_kw;
    $hiddenLink = array();
    //暂时屏蔽超链接
    preg_match_all("/(<a[^>]*>[\s\S]+?<\/a>)/i",$body,$match);
    $i=0;
    foreach($match[1] as $val)
    {
    $hiddenLink[$i] = $val;
    $body = str_replace($val,"preatag~{$i}~preatag",$body);
    $i++;
    }
    $body = keywordAddUrl($body,$RenQiang_kw);
    //恢复超链接
    foreach($hiddenLink as $key=>$val)
    {
    $body = str_replace("preatag~{$key}~preatag",$val,$body);
    }

    return $body;
    }
    function usort_strlen_desc($a, $b)//按照字符串长度降序排列
    {
    $lena = strlen($a["0"]);
        $lenb = strlen($b["0"]);
        return $lena > $lenb ? -1 : ($lena == $lenb ? 0 : 1);
    }
    function keywordAddUrl($str,$keywords)
    {
    /*
    $keywords数组原形
    $keywords[0][0] = "张学良";
    $keywords[0][1] = "http://xxx.com";
    ..............................
    */
    $length = count($keywords);
    $array = array();
    $replaceC = 50;//替换成功链接的个数
    $j=0;
    for($i=0;$i<$length;$i++)
    {
    //全英文的关键字不给替换以防止造成标签错误
    if(preg_match("/[a-z]*/i",trim($keywords[$i][0]),$match)) continue;
    if(strpos($str, $keywords[$i][0]) !== false)
    {
    $str = str_replace_once_str($keywords[$i][0],"~_{$i}_~",$str);
    $array[] = $i;
    $j++;
    if($j>=$replaceC) break;
    }
    }
    foreach($array as $i)
    {
    $str = str_replace_once_str("~_{$i}_~","<a href=\"" . (strstr(strtolower($keywords[$i][1]),"http://") ? $keywords[$i][1]: $GLOBALS["cfg_basehost"] . "/l/" . $keywords[$i][1]) ."\" >" . $keywords[$i][0] . "</a>",$str);
    }
    return $str;
    }
      

  7.   

    $s = <<< HTML
    <a href="http://baidu.com">我想测试 </a>如果大海能 <strong>挽回 </strong>
    HTML;$ar = preg_split('/(<.+?>)/', $s, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);function foo($v) {
      return $v[0] != '<';
    }$len = 10;
    mb_internal_encoding('gbk');
    foreach(array_filter($ar, 'foo') as $k=>$r) {
      $n = mb_strlen(trim($r));
      if($n < $len) {
        $len -= $n;
      }else {
        $ar[$k] = mb_substr($r, 0, $len) . '[广告]' . mb_substr($r, $len);
        break;
      }
    }
    echo join('', $ar);