正则表达式:查找所有旧的PHP开放标记

时间:2015-04-02 10:45:07

标签: php regex

我正在尝试查找并替换所有旧式PHP开放代码:<?<?=。我尝试了几件事:

查找所有<?个字符串并将其替换为<?php并忽略XML

sudo grep -ri "<?x[^m]" --include \*.php /var/www/

这不会返回任何结果,因此使用<?x打开的所有标记都是XML开始标记,应该被忽略。

然后我对以<?p开头但不是<?php

的标签做了相同的操作
sudo grep -ri "<?p[^h]" --include \*.php /var/www/

这返回了我手动编辑的一个页面 - 因此不再返回结果。所以我可以确定以<?p开头的标签都是<?php,而x和xml也是如此。

sudo grep -ri "<?[^xp]" --include \*.php /var/www/

查找不应替换的更多开场标记

从这里开始,我可以运行上面的命令,看看会出现什么:空格,制表符,换行符,={(可以忽略)。我认为\s会处理空白,但我仍然会得到很多结果。

尝试此操作会产生包含标签的无穷无尽的列表:

sudo grep -ri "<?[^xp =}\t\n\s]" --include \*.php /var/www/

所以最后这没用。我无法扫描数千行。这个表达有什么问题?如果某个地方<?jsp存在且不应该被替换,我想知道这一点,将其排除,然后再获取一个较短的列表,并重复此操作直到列表为空。这样,我确定我不会更改不应该更改的标签。

更新:^ M

如果我在Vim中打开结果,我会看到^M,这是一个换行符。这可以通过命令行直接粘贴以下内容,其中^M位于下面的代码中:使用 Ctrl + V Ctrl + M enter a literal Carriage Return character into your grep string。这将结果减少到1000行。

sudo grep -ri "<?[^xp =}\t\n\s^M]" --include \*.php /var/www/

替换旧标记

如果这个表达式有效,我想运行一个sed命令并用它来替换旧的开始标记。

  • <?应该成为<?php(带有结尾空格)
  • <?=应该成为<?php echo(带有结尾空格)

这将导致一个或多个这样的命令,首先替换<?,然后替换<?=

sudo find /var/www/ -type f -name "*.php" -exec sed -i 's/<?[^xp=]/<?php /g' {} \;
sudo find /var/www/ -type f -name "*.php" -exec sed -i 's/<?=/<?php echo /g' {} \;

问题

  1. 要获得搜索(grep)和替换(sed)工作,我需要知道如何排除所有空格。在Vim中,我看到需要排除的^M字符。
  2. 如果我的方法有误,请告诉我。欢迎所有建议。

1 个答案:

答案 0 :(得分:0)

我刚刚用一些文件做了一个小的Perl测试......似乎工作正常。这不是为你做的伎俩吗?

shopt -s globstar # turn on **
perl -p -e 's/<\?=/<php echo/g;s/<\?/<php/g' so-test/**/*.php
  • 更改您要测试的文件夹的so-test
  • -i.bak之前添加-e选项以创建备份文件。
  • 仅添加-i(不包含.bak)以影响文件。如果没有-i,结果将打印到控制台而不是写入文件。适合测试!