【问题标题】:Converting HTML ordered/unordered list to plain text in PHP [duplicate]在PHP中将HTML有序/无序列表转换为纯文本[重复]
【发布时间】:2020-02-01 14:08:15
【问题描述】:

我在 HTML 中有一些 HTML 有序/无序列表。由于我想将其导出为 txt 文件,因此我需要将其转换为纯文本。

例如。原始 HTML:

<ol><li>Item 1</li></li>Item 2</li><li>Item 3</li></ol>

我想改成

1. Item 1
2. Item 2
3. Item 3

我在 StackOverflow 上进行了搜索,但只找到了相反转换的解决方案。 A regex that converts text lists to html in PHP

有什么办法可以解决吗?谢谢!

【问题讨论】:

  • 对了,原来的HTML有一个错误,第二个li标签以开头,而不是
  • 。
  • 您希望将 HTML 呈现的输出保存在文本文件中?
  • 您想知道如何使用 PHP 将 HTML 转换为文本吗?或者任何方式都可以接受?也许 XSLT 可能是合适的?
  • 标签: php html regex dom html-lists


    【解决方案1】:

    您可以简单地替换不需要的标签,然后将其分解为一个标签,该标签将为每一行返回自身。

    <?php
    $html = '
    <ol>
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
    </ol>
    ';
    
    $html = str_replace(['<ol>', '</ol>', '</li>'], '', $html);
    $html = explode('<li>', $html);
    
    print_r($html);
    

    【讨论】:

      【解决方案2】:

      我认为它比正则表达式要复杂一些,尤其是如果您想在前面添加数字。但是这段小代码会将<ol><li>Item 1</li></li>Item 2</li><li>Item 3</li></ol> 翻译成

      * Item 1
      * Item 2
      * Item 3
      
      <?php
      
      $string = "<ol><li>Item 1</li><li>Item 2</li><li>Item 3</li></ol>";
      
      $string= preg_replace("/<li>/", " * ", $string);
      $string= preg_replace("/<\/li>/", "\n", $string);
      $string= preg_replace("/<\/?ol>/", "", $string);
      
      echo $string;
      

      【讨论】:

      • * 并不代表 有序 列表。这可能适用于无序列表
      • 正如我所说,你将不得不循环遍历列表来添加数字,据我所知,你不能循环遍历并在正则表达式中添加数字。
      • 请记住 - 用户将名称“Item 1”作为示例,它是 item 1,这并不意味着该项目中会有一个数字。
      • 我知道,但如果他想要一个有序列表,他可以创建一个 for 循环,在每一行添加一个数字或类似的东西。
      【解决方案3】:

      请查看html2text 库。它有不同的方法将您的HTML 字符串转换为纯文本。

      【讨论】:

        【解决方案4】:

        我认为我们需要在这里记住,LI 标签中提到的数字不能用作参考,因为它们可能是“驴”、“羊”、“猴子”。

        我的解决方案匹配 LI 标记内的任何内容,然后循环匹配以创建项目编号。

        preg_match_all 将创建一个带有子数组的数组。第一个包含整个匹配项,包括 LI 标记,第二个只匹配在 (.*?) 非贪婪区域内找到的任何内容。

        我已经使用 \n 作为换行符,但如果是 HTML 输出,那显然是一个 BR 标记

        $str = "<ol><li>Monkey</li></li><li>Lamb</li><li>Elephant</li></ol>";
        preg_match_all("/<li>(.*?)<\/li>/i",$str,$matches);
        if(count($matches[1])>0){
            foreach($matches[1] as $k=>$v){
                echo ($k+1).". $v\n";
            }
        }
        

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多
          热门标签