正则表达式将一个大的 html 表拆分为多个 5 行的表

洛尔莫斯克

我正在尝试使用 regExps 进行排序,所以我在途中遇到了一个问题:问题是我有一些带有纯文本的随机 HTML 文件,并且只有一个表格。文本可以在表格前后,表格不包括<thead><tbody><tfoot> rowspan等等。因此,我需要将此表拆分为多个表,每个表 5 行,最后一个表不超过 5 行,并在每个表中重复原始表的第一个字符串。例如:

<table>
  <tr>
   <td>A</td><td>B</td>
  </tr>
  <tr>
   <td>A1</td><td>B1</td>
  </tr>
  <tr>
   <td>C</td><td>D</td>
  </tr>
  <tr>
   <td>E</td><td>F</td>
  </tr>
  <tr>
   <td>E1</td><td>F1</td>
  </tr>
  <tr>
   <td>E2</td><td>F2</td>
  </tr>
  <tr>
   <td>E3</td><td>F3</td>
  </tr>
  <tr>
   <td>E4</td><td>F4</td>
  </tr>
</table>

应该变成:

<table>
  <tr>
   <td>A</td><td>B</td><--!!!(not needed to be in code)-->
  </tr>
  <tr>
   <td>A1</td><td>B1</td>
  </tr>
  <tr>
   <td>C</td><td>D</td>
  </tr>
  <tr>
   <td>E</td><td>F</td>
  </tr>
  <tr>
   <td>E1</td><td>F1</td>
  </tr>
</table>
<table>
  <tr>
   <td>A</td><td>B</td><--!!!(not needed to be in code)-->
  </tr>
  <tr>
   <td>E2</td><td>F2</td>
  </tr>
  <tr>
   <td>E3</td><td>F3</td>
  </tr>
  <tr>
   <td>E4</td><td>F4</td>
  </tr>
</table>

这些东西我需要在 PHP 中使用 PCRE 来完成,包括大量的模板和更改。所以我在实现上有问题。现在我可以找到像这样的第一行<table>\s*?(<tr>(?:\s|.)*?<\/tr>)和 4 行,(<tr>(?:\s|.)*?<\/tr>\s*){1,4}但我不知道如何找到第二个模板的所有出现,以便稍后使用它们以及如何停止搜索是否有</table>表格结束标记。所以请帮忙

编辑

问题已得到解答,所以下一级添加原始表格标签<thead><tbody><tfoot>在输出表中,应该重建原始表的结构,所以我的意思是如果原始表的第一行是<thead>标签的一部分,它应该在<thead>所有输出表中。

特里科特

您可以通过执行一个循环来实现这一点,其中每次迭代都会添加下一个“表格中断” preg_replace(但请参阅最后的免责声明)。建议的正则表达式将找到以下组:

  • <table>标签的最后一次出现以及它后面的第一行,或者,如果有thead和/或tbody标签,直到结束</thead>标签,<tbody>如果有开始标签,则包括开始标签。
  • 接下来的 4 行。其中必须有 4 个。

然后它还会向前看以确保至少还有一行。

有了这些信息,就可以将单个“表格中断”注入到 HTML 字符串中。

如果表有一个tfooter部分(它也应该在表的每个分区中重复),我们还没有那个信息,因为它出现在输入的最后。因此,在循环开始之前,需要进行单独的解析以提取页脚。

这是假设输入在变量中的代码$html

// Extract the footer part (if there is one) and closing table tag
preg_match("#(\s*(</tbody|<tfooter).*?)?</table>#s", $html, $tableEnd);
$tableEnd = $tableEnd[0];

// Add a table break in each iteration as long as the last partition has more than 4 rows:
while (true) {
    $res = preg_replace("#(<table(?!.*<table).*?/tr>(?:.*?/thead>)?(?:.*?<tbody>)?)((?:.*?/tr>(?=\s*<tr)){4})#s", 
                        "$1$2$tableEnd\n$1", $html);
    if (strlen($res) === strlen($html)) break;
    $html = $res;
}

echo $res;

看看它在eval.in 上运行

主要正则表达式的解释

以下是主要正则表达式中的一些亮点:

  • #:我使用它作为正则表达式分隔符,而不是/为了避免需要/在正则表达式内部转义如果您需要/用作分隔符,则将每个转义/\\/:一个反斜杠用于正则表达式,另一个用于在字符串文字的上下文中转义该反斜杠。

  • (?!.*<table): 确保<table>在我们即将匹配的标签之后没有其他标签。这是一个消极的展望。

  • ((?:.*?/tr>(?=\s*<tr)){4}): 抓取 4 行,并积极向前看 ( (?= )) 要求每行紧跟另一行。(?: )模式不会创建捕获组,但外括号确实创建了一个捕获组。

更换

如果替换只是再次注入 2 个捕获的组(即$1$2),那么什么都不会改变。附加$tableEnd\n$1将关闭表格(带有页脚)并通过重用第一个捕获组开始下一个。这将<table>包含包含第一行和/或表标题的开始标记。

免责声明

尽管上述方法在许多情况下可能有效,但很可能会破坏它,因为正则表达式不是解析/解释 HTML 的理想方式。您真的应该为此使用 DOM api,而 PHP 有一个:DOMDocument.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式将一个段落拆分为句子,但跳过前缀标题

来自分类Dev

将列值与存储在另一个表中的正则表达式值列表进行比较,并进行相应更新

来自分类Dev

将数据表拆分为多个固定大小的表

来自分类Dev

vba-将Excel工作表拆分为多个文件

来自分类Dev

根据文本列的正则表达式模式匹配将表拆分为相关表

来自分类Dev

将一个大的postgres表拆分为多个csv

来自分类Dev

将表拆分为多个数据框

来自分类Dev

如何将一个大型数据库表拆分为多个数据库表

来自分类Dev

使用正则表达式解析HTML表行

来自分类Dev

正则表达式/ Perl-对哈希表进行反向排序,即使在正则表达式之后,哈希表也将空白作为其中的第一个值

来自分类Dev

将列值与存储在另一个表中的正则表达式值列表进行比较,并进行相应更新

来自分类Dev

使用正则表达式获取最后一个表

来自分类Dev

在MySQL中将一个大表拆分为多个表或坚持使用一个表是否更有效?

来自分类Dev

将html代码拆分为多个部分

来自分类Dev

我想根据页面宽度将较长的HTML表行拆分为多行

来自分类Dev

使用一个正则表达式将整个文本拆分为单词

来自分类Dev

如何基于分隔符值将Excel工作表拆分为多个工作表?

来自分类Dev

正则表达式:将行的顺序从最后一个更改为第一个(多个文件)

来自分类Dev

使用bigquery和单个查询进行分区,根据日期将表拆分为多个表

来自分类Dev

将Excel工作表从一个Excel文件拆分为多个Excel文件

来自分类Dev

VBA-将Excel文件拆分为多个文件并将这些文件拆分为多个工作表

来自分类Dev

使用一个或多个单词作为搜索关键字匹配一行的正则表达式

来自分类Dev

c#将一个数据表拆分为多个数据集

来自分类Dev

使用速度基于列将一张表拆分为多个表

来自分类Dev

将分隔表拆分为行

来自分类Dev

使用 Tidyverse 方法将数据集拆分为多个表

来自分类Dev

使用 Oracle SQL 从基于从另一个表拆分的正则表达式的表中进行选择

来自分类Dev

如何将数据拆分为多个工作表,其中有 3 个标题行?

来自分类Dev

如何将一个表行拆分为多个子表?

Related 相关文章

  1. 1

    正则表达式将一个段落拆分为句子,但跳过前缀标题

  2. 2

    将列值与存储在另一个表中的正则表达式值列表进行比较,并进行相应更新

  3. 3

    将数据表拆分为多个固定大小的表

  4. 4

    vba-将Excel工作表拆分为多个文件

  5. 5

    根据文本列的正则表达式模式匹配将表拆分为相关表

  6. 6

    将一个大的postgres表拆分为多个csv

  7. 7

    将表拆分为多个数据框

  8. 8

    如何将一个大型数据库表拆分为多个数据库表

  9. 9

    使用正则表达式解析HTML表行

  10. 10

    正则表达式/ Perl-对哈希表进行反向排序,即使在正则表达式之后,哈希表也将空白作为其中的第一个值

  11. 11

    将列值与存储在另一个表中的正则表达式值列表进行比较,并进行相应更新

  12. 12

    使用正则表达式获取最后一个表

  13. 13

    在MySQL中将一个大表拆分为多个表或坚持使用一个表是否更有效?

  14. 14

    将html代码拆分为多个部分

  15. 15

    我想根据页面宽度将较长的HTML表行拆分为多行

  16. 16

    使用一个正则表达式将整个文本拆分为单词

  17. 17

    如何基于分隔符值将Excel工作表拆分为多个工作表?

  18. 18

    正则表达式:将行的顺序从最后一个更改为第一个(多个文件)

  19. 19

    使用bigquery和单个查询进行分区,根据日期将表拆分为多个表

  20. 20

    将Excel工作表从一个Excel文件拆分为多个Excel文件

  21. 21

    VBA-将Excel文件拆分为多个文件并将这些文件拆分为多个工作表

  22. 22

    使用一个或多个单词作为搜索关键字匹配一行的正则表达式

  23. 23

    c#将一个数据表拆分为多个数据集

  24. 24

    使用速度基于列将一张表拆分为多个表

  25. 25

    将分隔表拆分为行

  26. 26

    使用 Tidyverse 方法将数据集拆分为多个表

  27. 27

    使用 Oracle SQL 从基于从另一个表拆分的正则表达式的表中进行选择

  28. 28

    如何将数据拆分为多个工作表,其中有 3 个标题行?

  29. 29

    如何将一个表行拆分为多个子表?

热门标签

归档