此问题的根源是因为我在网站上投放广告,我的内容主要是存储在数据库中的HTML,所以我决定放置“文字广告”,即不在固定区域内的广告。
我的解决方案是按段落explode
放置内容并将文本广告放置在p
标记的中间,这很不错,因为我使用CKEditor生成了内容,我认为图像,块引用和其他标签将嵌套在p
标记内(愚弄我),我现在意识到图像和块引用已从我的帖子中消失了,接下来我该怎么做?我使用explode
将代码更改为*
而不是用p
标签爆炸,我唱得太早了,因为现在我得到了很多重复的内容,例如,如果我有一个现在我得到的图像是其他所有标签的4倍,我不确定该重复项的来源,但我认为它与嵌套HTML有关,我寻找了数小时的解决方案,现在我我在这里问是否有人可以帮助我解决这个头痛问题
这是我的代码:
//In a helper file
function splitByHTMLTagName(string $string, string $tagName = 'p')
{
$text = <<<TEXT
$string
TEXT;
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$nodes = [];
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $text);
foreach ($dom->getElementsByTagName($tagName) as $node) {
array_push($nodes, $dom->saveHTML($node));
}
libxml_clear_errors();
return $nodes;
}
//In my view
$text = nl2br($database['content']);
$nodes = splitByHTMLTagName($text, '*');
//Using var_dump($nodes); here shows the duplicates are here already.
$nodes_count = count($nodes);
$show_ad_at = -1;
$was_added = false;
if($nodes_count % 2 == 0 ){
$show_ad_at = $nodes_count /2;
}else if ($nodes_count == 1 || $nodes_count < 3){
$show_ad_at = -1; //add later
}else if ($nodes_count > 3 && $nodes_count % 2 != 0){
$show_ad_at = ceil($nodes_count/2);
}
for($i = 0; $i<count($nodes); $i++){
if(!$was_added && $i == $show_ad_at){
$was_added = true;
?>
<div>
<script></script><!--This script is provided to me, it adds the ad where it is placed, I don't show the full script, It has nothing to do with the duplicates problem-->
</div>
<?php
}
echo $nodes[$i]; //print the node that comes from $nodes array where the duplicates already exist
}
if(!$was_added){
$was_added = true;
?>
<div>
<script></script><!--This script is provided to me, it adds the ad where it is placed, I don't show the full script, It has nothing to do with the duplicates problem-->
</div>
<?php
}
我该怎么办? 预先感谢。
Postdata#1:我将codeigniter用作PHP框架
Postdata#2:我的广告提供商没有像Google一样实现“文字广告”。
答案 0 :(得分:0)
似乎您在if语句中打印“广告块”。 如果我没误解的话,您的代码就像
foreach ... {
if (strpos($html_line, "In-Text Ads") !== FALSE) {
print($ads_html);
}
我认为,如果在输出值时使用的是print()之类的东西,则应该使用str_replace()而不是像函数的print()之类的东西。