2011-09-29 82 views
2

我有php文件,我想删除结束标记(?>),但只有当它是最后一个结束标记并且没有任何内容后。使用perl正则表达式关闭php标签

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

我已经试过模式的/(\ S * \> \ S *?)$ // s'和它的几个突变,但没有成功:他们删除所有出现的>,打破?代码,我不知道如何匹配EOF。 (是的,我知道一个解决方法:使用例如tail -1来检查文件的最后一行,但它会使我的整个代码格式化脚本变得复杂,所以如果问题可以通过正确构造的正则表达式来解决,那将是很好的)

+0

你的正则表达式应该工作 - 但只有当你阅读整个文件内容到一个变量 - 然后解析它。如果你使用'perl -p -i -e's /(\ s * \?> \ s *)$ //'filename.php',那么每行都会被一次处理一个。显然,这将剥离所有事件。 –

回答

2

我现在有机会测试它。读取所有文件确实有效。这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 
?> 
+0

+1为实际解决OPs问题的唯一反应... –

+1

它的工作原理:'perl -pi -w -0777 -e's /(\ s * \?> \ s * )$ /;/s'file.php'(参数-0777用于单行读取文件作为一个字符串)。另外,我发现用空字符串替换?>可能会导致语法错误,例如对于这样的行:'<?php echo'a'?>。用';'代替是安全的。谢谢大家。 –

0

好吧,我们来分析一下。

你想匹配'?>',所以我们将从('?>')开始,但是因为'?'在正则表达式中有特殊的意义,我们需要逃避它:​​。

我们不关心结束标记之前的内容,但我们要确保它之后什么都没有(除了空格)。你有这么多的钱:我们需要\s$。我会这样做:

('\?>')\s*$ 

希望能为你工作。

+0

'\ w'是一个单词字符,而不是空格。你想要'\ s'。 – alex

+0

@alex很正确 - mea culpa –