2

というか、「PHP 配列のキーとして使用される引用符で囲まれていない文字列を修正する」ですが、それはタイトルとしては少し長かったです。

配列が次のように記述されている非常に大きなコードベースを継承しました。

$array[id] = 0;
$array[value] = "test"

このコードは実際には機能しますが、多くのUse of undefined constant通知がスローされるため、これらの行は実際には次のようになる必要があります。

$array['id'] = 0;
$array['value'] = "test"

数十万行のコードが数千のファイルに分散しているということです。

また、次のようなケースもあります。

$_SESSION[user_information][access_bit][ACCESS_NULL] = 1;

user_informationとは文字列access_bitを意味しACCESS_NULL、定義された定数です。良いことは、定数が大文字でのみ定義されることです。

さらに興味深いことに、同じ php ファイルに JavaScript も含まれていますarray[id] = 0;

この混乱を効率的にクリーンアップし、未定義の定数をすべて一重引用符で囲みたいのですが、単純な検索/置換 (正規表現を使用しても) がそれを行うかどうかはわかりません。何かご意見は?

4

1 に答える 1

1

思ったより簡単でした。

function fix_unquoted_array_keys($filename){
    if(!is_file($filename)){
        return "File not found!";
    }
    $content = file_get_contents($filename);
    $content = preg_replace('/^!|\$([a-zA-Z_]+)\[([a-z_]+)\]/','\$$1[\'$2\']',$content);
    $content = preg_replace('/\]\[([a-z_]+)\]/','][\'$1\']',$content);
    file_put_contents($filename,$content);

    // Check the file just in case we break something.
    @exec("php -l ".$filename." 2>&1",$syntax);
    if($syntax[0] && strpos($syntax[0],"No syntax errors") === false){
        return $syntax[0];
    }

    return "OK";
}

最初のものは、 のpreg_replaceようなすべての単純な配列を置き換え$user[id]ます$user['id']$user[data][id]のような多次元配列を残します$user['data'][id]。大文字のキーはおそらく定義済みの定数であるため、意図的に一致させていません。

2 番目preg_replaceは、前のキーの閉じ括弧を一致させるだけで、後続のすべてのキーで機能します。

これは最も洗練されたソリューションではないかもしれませんが、うまくいったようです。過去1時間の差分をチェックしていますが、これが失敗した場所が1つも見つかりません。

PS PHPトークナイザーは、未定義の定数を文字列として変換しているように見え、トークン化されているため、このタスクで失敗しますT_STRING

于 2016-04-20T19:21:19.773 に答える