найти элементы с «simple_HTML_DOM» и объединить их

#php #simple-html-dom

#php #простой-html-dom

Вопрос:

Я хочу извлечь все p-элементы html-строки через simple_html_dom. Порядок p-элементов должен быть получен.

 <section class="box_1">
    <header class="trigger"><h2>Title</h2></header>
    <div class="content">
        <div class="box_2">
            <div class="class"></div>
            <div class="content">
                <p>Text Level 2</p>
                <p>More Text Level 2</p>
            </div>
        </div>
        <div class="box_2">
            <div class="class"></div>
            <div class="content">
                <p>Text Level 2</p>
                <div class="box_3">
                    <div class="content">
                        <p>Text Level 3</p>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>
  

НО все p-элементы в одном контейнере содержимого должны быть объединены вместе.

Я попробовал это:

 foreach($html->find('p') as $element) { 
    if ($element->parent()->parent()) {
        $class= $element->parent()->parent()->getAttribute('class');
        if ($class=="box_3") $level = 3;
        else if ($class=="box_2") $level = 2;
        else if ($class=="box_1") $level = 1;
    }
    else { $level = 0; }
    $array_content_element = array("level" => $level, "inhalt" => $element->plaintext);
    array_push($array_content, $array_content_element);
}
  

Но при этом, т.Е. «Уровень текста 2» и «Дополнительный уровень текста 2» будут обрабатываться как два элемента. Но они должны быть объединены в «Текстовый уровень 2 nMore Текстовый уровень 2», и это должно обрабатываться как ОДИН элемент.

Итак, в этом примере результатом должен быть массив с тремя элементами (вместо четырех).

Обновление: я кое-что забыл. За пределами элементов раздела могут быть p-элементы. Пожалуйста, взгляните на следующий «Lorem ipsum».

 <p>Lorem ipsum</p>
<p>Lorem ipsum</p>
<section class="box_1">
    <header class="trigger"><h2>Title</h2></header>
    <div class="content">
        <div class="box_2">
            <div class="class"></div>
            <div class="content">
                <p>Text Level 2</p>
                <p>More Text Level 2</p>
            </div>
        </div>
        <div class="box_2">
            <div class="class"></div>
            <div class="content">
                <p>Text Level 2</p>
                <div class="box_3">
                    <div class="content">
                        <p>Text Level 3</p>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>
<p>Lorem ipsum</p>
<p>Lorem ipsum</p>
<section class="box_1">
    <header class="trigger"><h2>Title</h2></header>
    <div class="content">
       <p>Text Level 1</p>
    </div>
</section>
<p>Lorem ipsum</p>
<p>Lorem ipsum</p>
  

Эти p-элементы следует обрабатывать так же, как и другие (суммировать p-элементы одного блока). В этом случае уровень = 0.

Ответ №1:

Сначала вы должны определить, что есть что. Это сирота или нет. Затем просто перейдите к следующему ключу / пакету, если он достигнет конца пакета (больше p не осталось тегов). Рассмотрим этот пример:

 include 'simple_html_dom.php';
$html_string = '<p>Lorem ipsum</p><p>Lorem ipsum</p><section class="box_1"> <header class="trigger"><h2>Title</h2></header> <div class="content"> <div class="box_2"> <div class="class"></div> <div class="content"> <p>Text Level 2</p> <p>More Text Level 2</p> </div> </div> <div class="box_2"> <div class="class"></div> <div class="content"> <p>Text Level 2</p> <div class="box_3"> <div class="content"> <p>Text Level 3</p> </div> </div> </div> </div> </div></section><p>Lorem ipsum</p><p>Lorem ipsum</p><section class="box_1"> <header class="trigger"><h2>Title</h2></header> <div class="content"> <p>Text Level 1</p> </div></section><p>Lorem ipsum</p><p>Lorem ipsum</p>';
$html = str_get_html($html_string);
$array_content = array();
$index = 0;
foreach($html->find('p') as $key => $tag) {
    if($tag->parent()->tag == 'root') {
        // if alone p tag
        if(!isset($array_content[$index])) {
            $array_content[$index] = array('level' => 0, 'inhalt' => $tag->innertext);
        } else {
            $array_content[$index]['inhalt'] .= "n" . $tag->innertext;
        }

    } elseif($tag->parent->class == 'content') {
        // handle tags with proper parents
        $type = $tag->parent->parent->class;
         switch($type) {
            case 'box_1': $level = 1; break;
            case 'box_2': $level = 2; break;
            case 'box_3': $level = 3; break;
        }

        if(!isset($array_content[$index])) {
            $array_content[$index] = array('level' => $level, 'inhalt' => $tag->innertext);
        } else {
            $array_content[$index]['inhalt'] .= "n" . $tag->innertext;
        }

    }

    // change index if set to next batch
    if(!isset($tag->next_sibling()->tag) || $tag->next_sibling()->tag != 'p') {
        $index  ;   
    }

}

echo '<pre>';
print_r($array_content);
  

Должен выводить:

 Array
(
    [0] => Array
        (
            [level] => 0
            [inhalt] => Lorem ipsum
Lorem ipsum
        )

    [1] => Array
        (
            [level] => 2
            [inhalt] => Text Level 2
More Text Level 2
        )

    [2] => Array
        (
            [level] => 2
            [inhalt] => Text Level 2
        )

    [3] => Array
        (
            [level] => 3
            [inhalt] => Text Level 3
        )

    [4] => Array
        (
            [level] => 0
            [inhalt] => Lorem ipsum
Lorem ipsum
        )

    [5] => Array
        (
            [level] => 1
            [inhalt] => Text Level 1
        )

    [6] => Array
        (
            [level] => 0
            [inhalt] => Lorem ipsum
Lorem ipsum
        )

)
  

Комментарии:

1. Я использовал find(‘p’), потому что мне нужно получить порядок элементов.

2. @user3142695 проверьте мою редакцию, я надеюсь, что это подходит

3. Это здорово! Пока спасибо. Я кое-что забыл в своем сообщении. Поэтому я обновил его. Пожалуйста, взгляните на это. Надеюсь, вы сможете решить эту проблему.

4. @user3142695 вау! ваша структура только что усложнилась, проверьте мои изменения

5. @user3142695 я понял неправильную логику, ознакомьтесь с редакцией