问题 关闭后找到额外的空格/换行?>(php标签)


所以我在关闭之后有一个空格/新行?>(php标签)正在破坏我的应用程序。

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

理想情况下,在一些正则表达式结合查找grep以在unix框上运行之后。


972
2018-05-25 15:00


起源

我建议完全省略结束标记 ?> 在文件的末尾。 - KingCrunch
关闭PHP标记后的单个换行符很好(?>\n)。这是打破它的第二个新线(?>\n\n)。 - cweiske


答案:


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

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

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

至于模式,那就匹配了 ?> 后跟一个或多个空格或换行符,后跟文件末尾 \z。我发现,当我在我的文件夹上运行它时,许多PHP文件确实以一个换行结束。所以你可以更新那个正则表达式 '\?>[\s\n]+\n\z' 匹配单个上面和上面的空格的文件 \n 字符终止符。

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


13
2018-06-02 18:11



救命稻草!几个小时救了! - amurrell
我有一个问题,即PHP文件在下载MS Word文件时会输出一个新行(这会破坏文件)。我使用Dave正则表达式的这种变体来找到它: pcregrep -rMl '\?>\n\n\z' * - Jeremy


使用perl;

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

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


1
2018-05-25 18:41



不错的解决方案虽然我认为你仍然希望文件结束 一 换行('s / \ s * $ / \ n / s')。 - August Karlstrom


这可以通过常规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


1
2018-06-08 11:46





这适用于我的盒子:

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

这个想法是你只用尾巴的最后3个字符,然后丢弃那些'?','>'和换行符的文件。如果有空格或其他换行符,您将无法获得'?'字符..


0
2018-05-25 15:18





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

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

记得在一个临时文件上工作,并在sed操作后复制原始文件上的新文件。


0
2018-05-25 15:43





使用notepad ++你可以同时轻松替换所有文档,将文件放到文件夹并按CTRL + R,也可以使用Regex


-2
2018-05-25 15:03



-1 - Notepad ++是一个Windows编辑器 - August Karlstrom
使用 projects.gnome.org/gedit 或者npp.5.6.8.Installer.exe - Novo


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


-2
2018-05-25 15:05



这将找到每个带有空格的结束标记,即在其中 ?> <div class = "blah"><?php echo $blah;?></div><?php echo $blah2; ?> ,将找到第一个结束标记。我真的只需要文档末尾的那些在结束标记和文件末尾之间的东西。就像是 ?>*EOF - Andy Main
霰弹枪方法: find . -type f -name \*php -exec tail -1 {}|grep '?> ' \; 或类似的东西。 - Marc B