2011-09-29 8 views
2

私はphpファイルを持っていますが、最後の終了タグで後に何もない場合にのみ、終了タグ(?>)を削除したいと思います。perl regexを使ってストリップを閉じるphpタグ

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

私がしようとしているパターンの/(\ sの* \> \ *よ?)$ // S 'とその突然変異のいくつかが、成功しません:彼らはの出現をすべて削除>、壊します?コード、私はどのようにEOFに一致するか分からない。

(はい、私は回避策を知っている:ファイルの最後の行だけをチェックするなどtail -1を使用して、それは私の全体のコードの書式設定スクリプトが複雑になるので、問題は適切に構築正規表現で解決することができれば、それは素晴らしいことです)

+0

あなたの正規表現は動作するはずです - しかし、あなたは一つの変数にファイル全体の内容を読んでいる場合にのみ - と、それを解析:次のPHPコードに

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

を:このPerlコードは、私のために働きました。あなたが 'perl -p -i -e 's /(\ s * \?> \ s *)$ //' filename.php'のようなものを使うと、各行は一度に1つずつ処理されます。明らかに、これはすべての発生を取り除くでしょう。 –

答えて

2

私は今、それをテストする機会がありました。すべてのファイルを読むと機能します。

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

OPsの問題を実際に解決する唯一の応答は+1です... –

+1

これは動作します: 'perl -pi -w -0777 -e '/(\ s * \?> \ s * )$ /;/s 'file.php'(引数が1行の場合、引数-0777はファイルを1つの文字列として読み込みます)。また、?>を空文字列に置き換えると構文エラーが発生することがあります。そのような行には: '<?php echo 'a'?>。 ';'で置き換える安全です。みんなありがとう。 –

0

OK、これを解読しましょう。

'?>'と一致させたいので、('?>')で始まりますが、 '?'正規表現で特別な意味を持っているので、それをエスケープする必要があります:​​。

終了タグの前に気にする必要はありませんが、後ろには空白以外のものがないことを確認します。あなたはこれでお金にかなり恵まれました:\s$が必要です。私は次のようにします:

('\?>')\s*$ 

希望はあなたのために働く。

+0

'\ w'は空白ではなく単語文字です。 '\ s'が欲しい。 – alex

+0

@alexかなり正しい - mea culpa –

関連する問題