正则表达式:从 html 文件中删除所有注释,但保留相同数量的行

cod*_*ezo 1 php regex preg-replace laravel

如果文件中的注释覆盖了其中的 6 行,则应删除该注释并替换为与注释行数相等的空行。

这是我的意思的一个小示范。给定的 file.html 有 10 行:

    line 1 : <!-- text
    line 2 :      text
    line 3 :      text
    line 4 :      empty line
    line 5 :      text
    line 6 : -->
    line 7 :empty line
    line 8 :text
    line 9 :empty line
    line 10 :text
Run Code Online (Sandbox Code Playgroud)

预期的输出将是:

    line 1 :empty line
    line 2 :empty line
    line 3 :empty line
    line 4 :empty line
    line 5 :empty line
    line 6 :empty line
    line 7 :empty line
    line 8 :text
    line 9 :empty line
    line 10 :text
Run Code Online (Sandbox Code Playgroud)

我目前使用的模式preg_replace('/(?=<!--)([\s\S]*?)-->/', '', $contents);用空字符串替换文件的内容,这不会保留与文件以前相同的行数。

请注意,任何解决方案都需要保持文件的结构,因为第 8 行和第 10 行的文本不会改变文件中的位置。

编辑:不知道为什么这被标记为重复。考虑到人们通常想知道如何解析 dom,而不是我关于在不改变文件中的行数的情况下删除文件中的注释文本的非常具体且集中的问题,它绝不类似于假设的重复问题那个文件。

anu*_*ava 5

您可以使用此搜索进行搜索:

(?:^\h*<!--|(?<!\A|-->\n)\G).*\R
Run Code Online (Sandbox Code Playgroud)

并用一个替换它 "\n"

正则表达式演示

正则表达式详情:

  • (?:: 启动非捕获组
    • ^: 一行的开始
    • \h*<!--: 匹配 0 个或多个空格后跟 <!--
    • |: 或者
    • (?<!\A|-->\n):如果我们有开始位置或-->在前一个位置有+ 换行符,则负向后视以避免匹配
    • \G: 匹配上一场比赛的结束位置
  • ): 结束非捕获组
  • .*\R: 匹配行中剩余的字符后跟换行符

  • 为了匹配内联注释,删除行符号 `^` 的开头似乎可以解决问题: `$formattedContents = preg_replace('/(?:&lt;!--|(?&lt;!\A|--&gt;\n) \G).*\R/m', '\n', $contents);` (2认同)