PHP getElementsByTagName('*')避免重复节点|通过分隔内容节点来实现“文字广告”

时间:2019-02-04 04:50:01

标签: php domdocument

此问题的根源是因为我在网站上投放广告,我的内容主要是存储在数据库中的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一样实现“文字广告”。

1 个答案:

答案 0 :(得分:0)

似乎您在if语句中打印“广告块”。 如果我没误解的话,您的代码就像

foreach ... {
if (strpos($html_line, "In-Text Ads") !== FALSE) {
print($ads_html);
}

我认为,如果在输出值时使用的是print()之类的东西,则应该使用str_replace()而不是像函数的print()之类的东西。