【问题标题】:Strip closing php tag using perl regex使用 perl 正则表达式去除关闭 php 标记
【发布时间】:2011-09-29 10:52:05
【问题描述】:

我有 php 文件,我想删除结束标记 (?>),但前提是它是最后一个结束标记并且后面没有任何内容。

<?php
  //some code
?>
<?php
  //some other code
?> // <- this and only this should be removed

我尝试了模式 's/(\s*\?>\s*)$//s' 和它的几个突变,但没有成功:它们删除了所有出现的 ?>,破坏了代码,并且我不知道如何匹配EOF。

(是的,我知道一种解决方法:使用例如tail -1 仅检查文件的最后一行,但这会使我的整个代码格式化脚本复杂化,所以如果问题可以通过正确构造的正则表达式来解决,那就是太好了。)

【问题讨论】:

  • 您的正则表达式应该可以工作 - 但前提是您将整个文件内容读入一个变量 - 然后解析它。如果您使用perl -p -i -e 's/(\s*\?&gt;\s*)$//' filename.php 之类的内容,则每次处理每一行。显然,这将删除所有出现的情况。

标签: php regex perl tags


【解决方案1】:

我现在有机会测试它。读取所有文件确实有效。这个 perl 代码对我有用:

local $/;
open FH, "<", "tmp.php";
$var = <FH>;
print "$var\n\n";
close FH;
$var =~ s/(\s*\?>\s*)$//s;
print "$var\n";

关于以下 php 代码:

<?php
//some code
?>
<?php
//some other code
?>

【讨论】:

  • 它有效:perl -pi -w -0777 -e 's/(\s*\?&gt;\s*)$/;/s' file.php(单行参数 -0777 导致将文件作为一个字符串读取)。此外,我发现用空字符串替换 ?> 可能会导致语法错误,例如对于这样的行:`。替换为';'是安全的。谢谢大家。
【解决方案2】:

好的,让我们分解一下。

你想匹配'?>',所以我们将从('?&gt;')开始,但是因为'?'正则表达式中有特殊含义,需要转义:('\?&gt;')

我们不关心结束标签之前的内容,但我们要确保它之后没有任何内容(除了空格)。你在这方面很赚钱:我们需要\s$。我会这样做:

('\?>')\s*$

希望对你有用。

【讨论】:

  • \w 是一个单词字符,而不是空格。你想要\s
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2013-03-08
  • 2011-03-29
相关资源
最近更新 更多