【问题标题】:Regular Expression: find all old PHP open tags正则表达式:查找所有旧的 PHP 打开标签
【发布时间】:2015-06-07 07:00:47
【问题描述】:

我正在尝试查找和替换所有旧式 PHP 开放标签:<?<?=。我已经尝试了几件事:

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

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

这不会返回任何结果,因此所有以&lt;?x 打开的标签都是 XML 开始标签,应该被忽略。

然后我对以&lt;?p 开头但不是&lt;?php 的标签做了同样的事情

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

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

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

查找更多不应被替换的开始标签

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

尝试这样做会导致列表中带有标签的无穷无尽的列表:

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

所以最后这没有用。我无法扫描数千行。这个表达有什么问题?如果某处&lt;?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 命令并用它来替换旧的开始标签。

  • &lt;? 应该变成 &lt;?php(带结尾空格)
  • &lt;?= 应该变成 &lt;?php echo(带结尾空格)

这会产生一个或多个这样的命令,首先替换 &lt;?,然后是 &lt;?=

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. 如果我的方法有误,请告诉我。欢迎所有建议。

【问题讨论】:

标签: php regex


【解决方案1】:

我只是在这里用几个文件做了一个小的 Perl 测试......似乎工作正常。这不是对你有用吗?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多