php - 在 php 中制作 H2-H3 元素列表

标签 php html string dom

我有一个 PHP 变量,其中包含我的页面的 HTML 代码,该变量仅包含段落和 H2-H3 元素:

<h2>Header 1</h2>

<p>Some text</p>
...
<p>Some text</p>

<h3>Sub-header 1</h3>

<p>Some text</p>
...
<p>Some text</p>

<h2>Header 2</h2>

我正在尝试创建一个函数,该函数接受带有 HTML 代码的变量并返回带有 HTML ul 列表的字符串:

<ul>
    <li>Header 1
      <ul>
          <li>Sub-header 1</li>
      </ul>
    </li>
    <li>Header 2
      <ul>
          <li>Sub-header 2</li>
          <li>Sub-header 3</li>
      </ul>
    </li>
    <li>Header 3</li>
</ul>

这是我所取得的成就,但我坚持检测何时添加 sub-ul 标签以及如何执行此操作:

function generate_navigation($HTML) {
    $DOM = new DOMDocument();
    $DOM->loadHTML($HTML);

    $navigation = '<ul>';

    // Iterating through all elements
    $h2Iterator = 0;
    foreach($DOM->getElementsByTagName('*') as $element) {
        if($element->tagName == 'h2') {
            $h2Iterator++;
            $navigation .= '<li>' . $element->textContent . '</li>';
        } else if ($element->tagName == 'h3') {
            // How to add?
        }
    }

    return $navigation.'</ul>';
}

最佳答案

您需要跟踪打开的 h2 标签。不需要迭代器计数器,但需要迭代器状态。

function generate_navigation($HTML) {
    $DOM = new DOMDocument();
    $DOM->loadHTML($HTML);

    $navigation = '<ul>';

    // Iterating through all elements
    $h2IteratorStatus = 0; //0-closed, 1-open
    $h3IteratorStatus = 0; //0-closed, 1-open
    foreach($DOM->getElementsByTagName('*') as $element) {
        if($element->tagName == 'h2') {

            if($h3IteratorStatus){
                //it's open, need to close
                $navigation .= '</ul>';
                $h3IteratorStatus = 0;
            }

            if($h2IteratorStatus){
                //it's open, need to close
                $navigation .= '</li>';
                $h2IteratorStatus = 0;
            }

            $h2IteratorStatus = 1;
            $navigation .= '<li>' . $element->textContent ;

        } else if ($element->tagName == 'h3') {

            if(!$h3IteratorStatus){
                $navigation .= '<ul>';
                $h3IteratorStatus = 1;
            }

            $navigation .= '<li>' . $element->textContent .'</li>';
        }
    }

    //check for last opened h3
    if($h3IteratorStatus){
        $navigation .= '</ul>';
    }
    //check for last opened h2
    if($h2IteratorStatus){
        //it's open, need to close
        $navigation .= '</li>';
    }

    return $navigation.'</ul>';
}

根据您的评论进行更新,还可以跟踪打开的 h3 标签。

关于php - 在 php 中制作 H2-H3 元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40241975/

相关文章:

python - 使用 Python 将字符串中的字符转换为多个字符

php - 使用聚合调用 Laravel 关系

javascript - 超链接作为表单提交的替代方案

php - 如何使用 CodeIgniter 获取浏览器和平台信息?

javascript - 折叠菜单不起作用

java - 在Java中通过引用传递字符串?

php - 使用正则表达式解析多项选择列表

html - 我应该如何在数据库中存储带有照片和格式的文章?

javascript - 为什么我的 jQuery 函数没有传递参数并更改它?

连接来自 char 输入的字符串