提问者:小点点

php,解析一个有序的HTML列表并编辑<li>ST中的文本,而不影响周围的HTML标记


我试图使用PHP解析一个HTML列表,然后读取列表的内容(例如,儿童和年轻人,居民,专业人员)和标签,在列表中的每一位文本末尾附加一个“/”(除了最后一项),然后输出,而不编辑周围的任何HTML标签。

目前我已经在列表中读到了它,并添加了'/',但我正在移除周围的标记在这个过程中,谁有任何建议的方法做这件事或任何我应该使用的函数? 谢谢

<ol class="breadcrumb">
        <li class="inline odd first" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="https://my.northtyneside.gov.uk/category/75/residents" itemprop="url"><span itemprop="title">Residents</span></a></li> 
        <li class="inline even" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><a href="https://my.northtyneside.gov.uk/category/175/children-and-young-people" itemprop="url"><span itemprop="title">Children and young people</span></a></li> 
        <li class="inline odd last" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb"><span itemprop="title">Professionals</span></li>
    </ol>

    <?php

    function injectSlashes($breadcrumb){

        $doc = new DOMDocument();
        $doc->loadHTML($breadcrumb);
        $liList = $doc->getElementsByTagName('li');
        $liValues = array();
        foreach ($liList as $li) {
            $liValues[] = $li->nodeValue;
        }

        $correctBreadcrumb = implode("<span aria-hidden=\"true\">/</span>",$liValues);

        return $correctBreadcrumb;
    }
?>

共1个答案

匿名用户

一个简单的解决方案是更改存储在每个项目中的数据。

目前,您使用

$liValues[] = $li->nodeValue;

正如您所发现的那样,它只是项目的文本。

要存储HTML,需要使用saveHTML()。 通常这可能是一个文档片段,但是您可以将其简化为

  • 标记中的第一个子元素。。。

    $liValues[] = $doc->saveHTML($li->firstChild);
    

    如果需要保留

      标记,则会更加复杂。 这段代码提取标记并输出内容,内容如下

      <ol class="breadcrumb"></ol>
      

      然后,它像前面一样创建面包屑,并通过将><替换为>面包屑<来插入它。。。

      function injectSlashes($breadcrumb){
          $doc = new DOMDocument();
          $doc->loadHTML($breadcrumb);
          // Extract the ol
          $ol = $doc->getElementsByTagName('ol')[0];
          // Output the HTML for just the ol tag
          $olText = $doc->saveHTML($ol->cloneNode());
          $liList = $doc->getElementsByTagName('li');
          $liValues = array();
          foreach ($liList as $li) {
              $liValues[] = $doc->saveHTML($li->firstChild);
          }
      
          $list = implode("<span aria-hidden=\"true\">/</span>",$liValues);
          // Insert the breadcrumbs in the empty ol tag from above
          $correctBreadcrumb = str_replace("><", ">".$list."<", $olText);
          return $correctBreadcrumb;
      }