Получить массив меню из строки HTML, используя документ PHP DOM - PullRequest
0 голосов
/ 13 января 2020

У меня есть следующий код:

$string = '<html><head></head><body><ul id="mainmenu">
  <li id="1"><a href="1"> main menu 1 </a> </li>
  <li id="2"> <a href="2"> main menu 2 </a> </li>
    <ul class="sub-menu">
      <li id="3"> <a href="3"> Sub menu 2 </a> </li>
      <li id="4"> <a href="4"> Sub menu 2.1 </a> </li>
    </ul>
  </li>
</ul></body></html>';
$dom = new DOMDocument;
$dom->loadHTML($string);

Теперь я хочу выводить массив, содержащий поля href, value и подменю с соответствующими значениями, используя PHP DOM document.

Что-то вроде это:

Array
(
    [0] => Array
        (
            [href] => 1
            [name] => Main menu 1
            [sub] => Array
                (
                )

        )

    [1] => Array
        (
            [href] => 2
            [name] => main menu 2
            [sub] => Array
                (
                   [0] => Array
                    (
                       [href] => 3
                       [name] => sub menu 2
                       [sub] => Array
                             (
                              )

                    )

                   [1] => Array
                       (
                         [href] => 4
                          [name] => sub main menu 2.1
                         [sub] => Array
                             (

                             )

                   )
                )

        )
)

Я могу получить все пункты меню как главное меню и весь массив подменю как пустой. Как я могу добиться этого, анализируя HTML string?

1 Ответ

1 голос
/ 13 января 2020

Предполагая, что у вас есть только два уровня, этот код использует XPath для поиска начала каждого меню, а затем просматривает элементы <li>. Это делает то же самое для подменю, используя текущее главное меню в качестве начальной точки и только содержимое (используя descendant::, чтобы ограничить количество найденных узлов) ....

(мне пришлось измените HTML, поскольку в <li id="2"> <a href="2"> main menu 2 </a> </li>)

* было добавлено <li> *1009*. Если у вас есть список возможных идентификаторов, вы можете использовать XPath для поиска любого из них ..

//ul[@id="mainmenu" or @id="menu-main" or @id="menu-menu1"]/li

Вы можете построить это динамически из массива, если вам нужно ...

$menu_ids_arr = array('mainmenu', 'menu-main', 'menu-menu1');
$query = '//ul[';
foreach ( $menu_ids_arr as $id )    {
    $query .= '@id="'.$id.'" or ';
}
$query = substr($query, 0, -4).']/li';
$mainMenus = $xp->query($query);
...