PHP getElementsByTagName ('*') позволяет избежать дублирования узлов |«В текстовых объявлениях» путем разделения узлов контента - PullRequest
0 голосов
/ 04 февраля 2019

источник этой проблемы в том, что я размещаю рекламу на своем веб-сайте, мой контент в основном хранится в базе данных в формате HTML, поэтому я решил разместить "объявления в тексте", которые не находятся в фиксированной зоне.

Мое решение заключалось в explode содержании по абзацам и размещении текстового объявления в середине тегов p, которые работали довольно круто, поскольку я использую CKEditor для генерации контента, я думал, изображения, блок-цитаты, и другие теги будут вложены в теги p (обманывают меня). Теперь я понимаю, что изображения и блок-цитаты исчезли из моих сообщений. Что мне делать дальше?Я изменил свой код на explode, используя * вместо взрыва по тегу p, я спел победу слишком рано, потому что теперь я получаю много дублирующегося контента, например, если у меня есть одно изображение, я получаю то же самоеimage 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
    }

Что я могу сделать?Заранее спасибо.

Постданные # 1: я использую codeigniter в качестве PHP Framework

Постданные # 2: Мой поставщик рекламы не реализует "объявления в тексте" как такую ​​функцию, как Google.

1 Ответ

0 голосов
/ 04 февраля 2019

Кажется, вы печатаете «рекламный блок» внутри оператора if.Если я не правильно понял, ваш код похож на

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

Я думаю, вы должны использовать str_replace () вместо print () как функции, если вы используете что-то вроде print () при выводе значения...

...