20

私は何年にもわたって書かれたphpファイルの大規模なコレクションを持っており、すべての短い開始タグを適切な明示的な開始タグに適切に置き換える必要があります。

change "<?" into "<?php"

この正規表現はそれらを適切に選択すると思います:

<\?(\s|\n|\t|[^a-zA-Z])

次のようなケースを処理します

<?//
<?/*

しかし、フォルダ ツリー全体を処理して .php ファイル拡張子を検出し、正規表現を適用して変更後にファイルを保存する方法がわかりません。

適切なツールをマスターすれば、これはかなり簡単にできると思います。(sed マニュアルに興味深いハックがあります: 4.3 Example/Rename files to lower case )。

たぶん私は間違っています。
それとも、これはワンライナーでしょうか?


私は本当にあなたがこれで難しい道を歩んでいると思います. 私はその種の操作を頻繁に行い、その種の操作にはBRUを使用します (他に無数の代替手段が利用可能です)。BRU は小さく、持ち運び可能で、その仕事を非常にうまく行います。

そのための新しいバッチ ファイルを作成して時間を無駄にする正当な理由が 1 つも見つかりません。

4

13 に答える 13

16

正式な言語の解析に正規表現を使用しないでください。予期していなかった干し草の山に常に出くわすことになります。お気に入り:

<?
$bla = '?> now what? <?';

言語の構造を認識しているプロセッサを使用する方が安全です。html の場合、それは xml プロセッサになります。php の場合、組み込みのトークナイザー拡張機能です。、または、およびに一致するT_OPEN_TAGパーサー トークンがあり、またはまたはに一致します。すべての短い開始タグを置き換えるには、これらすべてのトークンを見つけて、 とに置き換えます。<?php<?<%T_OPEN_TAG_WITH_ECHO<?=<%=T_OPEN_TAG<?phpT_OPEN_TAG_WITH_ECHO<?php echo

実装は読者の演習として残します:)

EDIT 1 : ringmaster はとても親切に提供してくれました。

EDIT 2 : 、、 でオフshort_open_tagになっているシステムでは、置換スクリプトによって認識されません。このようなシステムでスクリプトを機能させるには、コマンド ライン オプションで有効にします。php.ini<?<%<?=short_open_tag

php -d short_open_tag=On short_open_tag_replacement_script.php

ps token_get_all() のマニュアル ページと、 tokenizertoken_get_all、およびパーサー トークン名の創造的な組み合わせについてのグーグル検索が役立つ場合があります。

pps define() の内容を解析する正規表現も参照してください。ここでSO

于 2009-03-26T06:51:39.767 に答える
14

トークナイザー オプションを使用している場合、これが役立つ場合があります。

$content = file_get_contents($file);
$tokens = token_get_all($content);
$output = '';

foreach($tokens as $token) {
 if(is_array($token)) {
  list($index, $code, $line) = $token;
  switch($index) {
   case T_OPEN_TAG_WITH_ECHO:
    $output .= '<?php echo ';
    break;
   case T_OPEN_TAG:
    $output .= '<?php ';
    break;
   default:
    $output .= $code;
    break;
  }

 }
 else {
  $output .= $token;
 }
}
return $output;

短いタグが有効になっていない場合、トークナイザーは短いタグを適切にトークン化しないことに注意してください。つまり、短いタグが機能していないシステムでこのコードを実行することはできません。コードを変換するには、別の場所で実行する必要があります。

于 2009-10-30T00:44:03.870 に答える
9

この問題は、 簡単にインストールでき、テストおよび保守されているツールのフィクサーとして解決されています。php-cs-fixer

修正は簡単です:

$ php-cs-fixer fix <path> --rules=full_opening_tag,no_short_echo_tag --diff --dry-run

<path>変更したいディレクトリまたはファイルへのパスに置き換えるだけです。与えられたコマンドは、最初に (--dry-run および--diffパラメーター) を確認することです。

php-cs-fixer のインストールは簡単です

$ composer global require friendsofphp/php-cs-fixer

パスにグローバル composer bin ディレクトリを使用して composer がインストールされている場合 (推奨)。

于 2016-11-06T13:36:30.410 に答える
4

これは私が書いた、短い開始タグを含む PHP ソースを変換して長いタグに置き換えるユーティリティです。

つまり、次のようにコードを変換します。

  <?= $var1 ?>
  <? printf("%u changes\n",$changes) ?>

これに

  <?php echo $var1 ?>
  <?php printf("%u changes\n",$changes) ?>

--skip-echo-tagsオプションを指定すると、 <?= タグがスキップされ、<?=タグのみが置き換えられます。タグ。

これは PHP-CLI スクリプトとして記述されており、短い短い開始タグを許可するようにCLI php.iniファイルを設定する必要があります。これは PHP 5.3.0 以前のデフォルト設定ですが、常にそうであるとは限りません。(設定が有効になっていない場合、スクリプトは何も変更しません。)

于 2010-10-25T17:31:39.077 に答える
3

それは正規表現の私のバージョンです:

<\?(?!(php|=|xml))(\s|\t|\n)
于 2010-01-27T03:47:36.187 に答える
1

ほぼ2000個のファイルでdanortonスクリプトを使用しましたが、それは魅力のように機能しました

彼のスクリプトを「fixtags.php」という名前のファイルに入れ、次のlinux1ライナーを使用して問題を解決しました。

find . -iname "*.php" | xargs php fixtags.php --overwrite

私が抱えていた唯一の問題は、サイズがゼロバイトのファイルに遭遇したときです。

于 2011-12-11T17:59:45.823 に答える
1

これを目的として、正規表現をより適切に機能するように簡素化しますが、実際のコードでテストしていないため、間違っている可能性があります。

コードのベースディレクトリに座っているとしましょう。次から始めることができます。

find . -iname "*.php" -print0

これにより、NULL 文字で区切られたすべての .php ファイルが取得されます。これは、ファイルにスペースが含まれている場合に必要です。

find . -iname "*.php" -print0 | xargs -0 -I{} sed -n 's/\(<\?\)\([^a-zA-Z]\)/\1php\2/gp' '{}'

これで、ほとんどの場合に到達するはずです。すべてのファイルが検出され、それぞれに対して sed を実行してコードを置き換えます。ただし、-i タグ (以下で使用) がないと、これは実際にはファイルに影響を与えず、コードを端末に送信するだけです。-n は通常の出力を抑制し、正規表現部分の後の p は、変更された行のみを出力するように指示します。

結果が正しい場合は、ファイルをその場で置き換えるという大きな一歩を踏み出します。これを試みる前に、必ずすべてのファイルをバックアップする必要があります!!!

find . -iname "*.php" -print0 | xargs -0 -I{} sed -i 's/\(<\?\)\([^a-zA-Z]\)/\1php\2/g' '{}'

それは仕事を成し遂げるはずです。残念ながら、私はその構文を使用する PHP ファイルを持っていません。したがって、ここから理解するのはあなた自身です。

  1. 「検索」ですべてのファイルを取得します
  2. そのファイルのリストを「xargs」に送信します(一度に1つずつファイルに対してコマンドを実行します
  3. 「sed」と構文「s/to-change/changed/」を使用して、正規表現の魔法を機能させましょう!
于 2009-03-26T06:54:43.970 に答える
0

XML/XHTML ページに次のコードを含めるのが一般的です。

<?php echo '<?xml version="1.0" encoding="UTF-8" ?>'; ?>

もちろん、次のいずれにも変更しないでください。

<?phpphp echo '<?phpxml version="1.0" encoding="UTF-8" ?>'; ?>

または:

<?php echo '<?phpxml version="1.0" encoding="UTF-8" ?>'; ?>
于 2009-03-26T08:40:57.040 に答える
0

残念ながら、自動化されたソリューションは機能しない場合があります。私の推奨事項:

1) grep を使用してすべての短いタグを検索します。

grep -rn "<?[^p]" *

2)各ファイルと行を調べて手動で修正します

大規模なプロジェクトがある場合、これが実行可能な解決策ではないことは理解していますが、私にとってはうまくいきました.

于 2013-11-26T20:42:48.077 に答える
0

PHPのバージョンを更新したときに同じ問題が発生しました。

これを使って:

find . -iname "\*.ph\*" -type f -print0 |xargs -0 sed -i -e 's/<? /<?php /g' -e 's/<?\/\//<?php \/\//g' -e 's/<?\/\*/<?php \/\*/g' -e 's/<?\=/<?php echo/g'

これにより、「<?」が変換されます。「<?php」に、「<?//」に「<?php //」に、「<?/ 」に「<?php /」に

あらゆる種類のファイル .php または .phtml

クレジット: https://coderwall.com/p/cnm0_w/replace-php-short-open-tags-with-full-form-in-all-php-files-using-one-command

于 2020-06-26T13:02:23.540 に答える