【问题标题】:Find extra space / new line after a closing ?> (php tag)在结束后查找额外的空格/新行?>(php标签)
【发布时间】:2011-05-25 15:00:46
【问题描述】:

所以我在关闭 ?>(php 标记)之后有一个空格/换行符,这会破坏我的应用程序。

如何轻松找到我在这个应用程序中有 1000 个文件和 100000 行代码。

理想情况下,我在一些正则表达式结合 find grep 在 unix 机器上运行之后。

【问题讨论】:

  • 我建议完全省略文件末尾的结束标签?>
  • 结束 PHP 标记后的单个换行符很好 (?>\n)。这是打破它的第二个换行符 (?>\n\n)。

标签: php regex unix find grep


【解决方案1】:

这里的问题是正常的 grep 不匹配多行。所以,我会安装pcregrep 并尝试以下命令:

pcregrep -rMl '\?>[\s\n]+\z' *

这将使用 PCRE 多行匹配(-M 部分)匹配文件夹和子文件夹(-r 部分)中的所有文件,并且仅列出它们的文件名(-l 部分)。

至于模式,匹配 ?> 后跟 1 个或多个空格或换行符,后跟文件结尾 \z。但我发现,当我在我的文件夹上运行它时,许多 PHP 文件实际上都以一个换行符结尾。因此,您可以将该正则表达式更新为 '\?>[\s\n]+\n\z',以匹配在单个 \n 字符终止符之上具有空格的文件。

最后,如果您需要检查文件的确切字符序列结尾,您始终可以使用od -c filename 打印文件的明确表示。

【讨论】:

  • 救命稻草!节省了几个小时!
  • 我遇到了一个问题,即下载 MS Word 文件时 PHP 文件输出了一个新行(这会损坏文件)。我使用 Dave 正则表达式的这个变体来找到它:pcregrep -rMl '\?>\n\n\z' *
【解决方案2】:

使用 perl;

perl -0777 -i -pe 's/\s*$//s' *.php
  • -0777 会吞下整个文件(-0 也可以)
  • -i - 就地编辑,因此文件将被替换为结果
  • -p 打印行数
  • -e perl 表达式

s/\s*$//s - 将所有行视为一行并将末尾的任何空格替换为空

【讨论】:

  • 不错的解决方案,尽管我认为您仍然希望文件以 one 换行符('s/\s*$/\n/s')结尾。
【解决方案3】:

这可以通过常规 grep 实现

grep -Pz '\?>[\s]+$' -Rl

将从当前目录开始搜索所有文件,并列出所有在文件末尾带有?> 后跟空格的文件。

  • -P 将模式解释为与 Perl 兼容的正则表达式 (PCRE)。
  • -z 将输入文件视为一长行 - 这部分是它工作的原因
  • [\s]+ 至少匹配一个空格 - 包括换行符

如果你只想匹配 PHP 文件:

find -name '*.php' | xargs grep -Pz '\?>[\s]+$' -l

在文件开头搜索空格之前

find -name '*.php' | xargs grep -Pz '^[\s]+<\?' -l

【讨论】:

    【解决方案4】:

    这适用于我的盒子:

    for i in `find . -name "*.php"`; do (echo -n "$i: "; tail -c 3 $i) | grep -v "[?]>"; done
    

    这个想法是你只取最后 3 个带尾字符的字符,然后丢弃那些是 '?'、'>' 和换行符的文件。如果有空格或其他换行符,您将不会得到“?”性格..

    【讨论】:

      【解决方案5】:
      sed -e :a -e '/^[ \n]*$/{$d;N;ba' -e '}' -e '$ s/\([^ ]\)*?>[ ]*/\1?>/' file.php > new_file.php
      

      对每个未完全测试的文件执行..

      记住要处理一个临时文件,并在 sed 操作后将新文件复制到原始文件上..

      【讨论】:

        【解决方案6】:

        这对我有用...

        <\?php | \?>
        

        如果您需要在 sublime-settings 文件或类似不喜欢正斜杠的文件中使用 in,您可能必须像这样为每个文件添加一个额外的斜杠...

        希望有帮助!

        【讨论】:

          【解决方案7】:

          这对我来说可以在 php 文件之前找到空格

          find -name '*.php' | xargs grep -Pz '\?>[\s]+$' -l
          

          【讨论】:

            【解决方案8】:

            grep '?&gt; ' *.php?当然,它可能不是空格,可能是换行符或制表符,因此您可能想尝试其他字符。

            【讨论】:

            • 这将找到每个带有空格的结束标记,即在?&gt; &lt;div class = "blah"&gt;&lt;?php echo $blah;?&gt;&lt;/div&gt;&lt;?php echo $blah2; ?&gt; 中,将找到第一个结束标记。我真的只需要文档末尾的那些在结束标签和文件末尾之间的东西。类似?&gt;*EOF
            • 猎枪方法:find . -type f -name \*php -exec tail -1 {}|grep '?&gt; ' \; 或类似的东西。
            【解决方案9】:

            使用notepad++,您可以轻松地同时替换所有文档,拖放该文件夹并按CTRL + R,也可以使用正则表达式

            【讨论】:

            • 是的,将 1000 多个文件加载到记事本中听起来是个好主意 :-)(讽刺)
            猜你喜欢
            • 1970-01-01
            • 2016-06-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多