1

適切な単一引用符で囲まれた配列文字列の代わりに多くの定数が使用されている大量の PHP スクリプトがあります。

例えば:

$row_rsCatalogsItems[Name]

(悪い)

それ以外の

$row_rsCatalogsItems['Name']

(良い)

スクリプトをより賢明な方法に変換するためにスクリプトで実行できるスクリプト (bash、php、最も使いやすいもの) を作成するにはどうすればよいですか?

[something] だけでなく、$variable_name[someIndex] にも一致することが理想的です。

文字列やhtmlの内部を台無しにする可能性を考えると、それが実行可能であるかどうかは実際には疑問に思っています.

4

3 に答える 3

2

これはTokenizerの仕事のようですね!

を使用して、解析されたすべてのトークンを PHP ソース ファイルから取得できますtoken_get_all。次に、結果の配列を調べて、各トークンを 1 つずつ評価できます。トークン名は、 を使用して検索できる番号として返されますtoken_name

PHP インタラクティブ プロンプトでの小さなデモ:

php > $str = '<?php echo $face[fire]; echo $face[\'fire\']; ?>';
php > $t = token_get_all($str);
php > foreach($t as $i => $j) { if(is_array($j)) $t[$i][0] = token_name($j[0]); }

そして、これは別のコード ブロックでの出力です。これは少し背が高く、スクロールしながらソース文字列を参照するのに適しているためです。

php > print_r($t);
Array
(
    [0] => Array
        (
            [0] => T_OPEN_TAG
            [1] => <?php
            [2] => 1
        )

    [1] => Array
        (
            [0] => T_ECHO
            [1] => echo
            [2] => 1
        )

    [2] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )

    [3] => Array
        (
            [0] => T_VARIABLE
            [1] => $face
            [2] => 1
        )

    [4] => [
    [5] => Array
        (
            [0] => T_STRING
            [1] => fire
            [2] => 1
        )

    [6] => ]
    [7] => ;
    [8] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )

    [9] => Array
        (
            [0] => T_ECHO
            [1] => echo
            [2] => 1
        )

    [10] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )

    [11] => Array
        (
            [0] => T_VARIABLE
            [1] => $face
            [2] => 1
        )

    [12] => [
    [13] => Array
        (
            [0] => T_CONSTANT_ENCAPSED_STRING
            [1] => 'fire'
            [2] => 1
        )

    [14] => ]
    [15] => ;
    [16] => Array
        (
            [0] => T_WHITESPACE
            [1] =>
            [2] => 1
        )

    [17] => Array
        (
            [0] => T_CLOSE_TAG
            [1] => ?>
            [2] => 1
        )

)

ご覧のとおり、悪意のある配列インデックスは、a のT_VARIABLE後に開き括弧が続き、次に引用符で囲まれていないT_STRINGaです。単一引用符で囲まれたインデックスは、 、引用符などとして表示されます。T_CONSTANT_ENCAPSED_STRING

この知識があれば、トークンのリストを調べて、実際にソースを書き直して、引用符で囲まれていない配列インデックスをすべて削除できます。それらのほとんどは明らかなはずです。ファイルを書き戻すときに、文字列を一重引用符で囲むだけです。

望ましくない副作用が確実に発生するため、数値インデックスを引用したくないことに注意してください。

また、式はインデックス内で有効であることにも注意してください。

$pathological[ some_function('Oh gods', 'why me!?') . '4500' ] = 'Teh bad.';

自動化されたツールを使用してこれらを処理するのは、ごくわずかで、わずかに困難ですつまり、それらを処理しようとすると、殺人的な怒りに陥る可能性があります. 定数/文字列の問題のみを修正することをお勧めします。正しく行われれば、通知カウントをより管理しやすいレベルまで下げることができるはずです。

(また、Tokenizer はカーリー文字列構文を実際のトークンとして処理することにも注意してください。T_CURLY_OPENこれにより、これらの厄介なインライン配列インデックスを処理しやすくなります。見逃した場合に備えて、すべてのトークンのリストをもう一度示します。)

于 2011-04-12T23:06:19.770 に答える
0

参考までに、私が取ったアプローチは次のとおりです。

すべての一般的なインクルード (ヘッダー、フッター、サイドバー) は、すべての通知を押しつぶし、昇格したレポート設定を受け取ります (たとえば、通知をログに記録します)。

古くて通知が多いメイン コンテンツは無視され、通知は表示/ログに記録されません。

私が書いた新しいメイン コンテンツでは、レポート設定が強化されます。

于 2011-07-14T14:27:37.427 に答える
0

また、従来の PHP コードを継承し、ソース ファイルを取得して引用符で囲まれていない配列インデックスを置き換える短い PHP スクリプトを作成しました。それは本質的に、チャールズが他の答えで示唆していることを行います。

コメントには、フォルダーとサブフォルダー内のすべての PHP ソース ファイルに対して配列インデックス修正プログラムを呼び出す bash コマンドライン スクリプトが含まれています。

ここでスクリプトのコピーを取得できます。

https://github.com/GustavBertram/php-array-index-fixer/blob/master/aif.php

于 2012-11-22T10:05:23.730 に答える