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>
将正文看做成一个字符串,对这个字符串进行遍历,同时进行设置数字数的计数器
设置一个开关变量,当碰到符号<时开关变量打开,当>时开关变量关闭
当开关变量打开时字数计数器无效
当字数计数器到达10时开始插入广告
$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;
?>
$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;
?>
{
//广告数组
$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;
}
如果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>
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;
}
<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);