0

私はconfig.phpファイルを更新する動的な方法に取り組んでいましたが、完全には解決できない興味深い不具合に遭遇しました。以下は、config.phpファイルを更新するための私のコードです。

if( isset( $_POST['submitted'] ) ) {

    $config_keys = array();
    foreach( $_POST as $key => $value ) {
        if( substr( $key, 0, 7 ) == 'config-' ) {
            $config_keys[ substr( $key, 7 ) ] = $value;
        }
    }

    $config_content = file_get_contents( dirname(__FILE__) . '/../../inc/config.php' );

    foreach( $config_keys as $key => $value ) {

        $config_content = preg_replace(
                                "/config\['$key'\](\s*)=(\s*)(['\"]?).*?(['\"]?);/",
                                "config['$key']$1=$2$3$value$4;",
                                $config_content
                            );

        $config[$key] = $value;

    }

    file_put_contents( dirname(__FILE__) . '/../../inc/config.php', $config_content );

}

論理はかなり健全です。「config-」で始まるPOST変数を検索し、「config-」の後のすべてを、更新する構成ファイルのキーの名前として使用します。構成ファイルの形式は次のとおりです。

$config['var1'] = 'value1';
$config['var2'] = 123;
$config['var3'] = '...';

90%の場合、これは完全に機能し$valueますが、数字で始まる場合$3、の最初の数字は$value置換中に完全に無視されます。

たとえば、設定ファイルには次の値があります。

$config['ls_key'] = '136609a7b4....'; // Rest of key has been truncated

この値を変更せずにキーを変更せずにフォームを送信すると、この行は突然次のようになります。

$config['ls_key'] = 36609a7b4...'; // Rest of key has been truncated

一重引用符がないため、構成ファイルの解析(サイト全体の破損)が妨げられ、起動するデータが失われます。PHP preg_replaceのマニュアルを読んだ後、いくつかの場所で中括弧を使用してみました(「例#1後方参照とそれに続く数値リテラルの使用」を変更)。次のいずれも機能しませんでした。

"config['$key']$1=$2${3}$value$4;",
"config['$key']$1=$2$3${value}$4;",
"config['$key']$1=$2$3{$value}$4;",
"config['$key']$1=$2{$3}$value$4;", // This one actually leads to syntax errors
"config['$key']${1}=${2}${3}$value${4};",

最初の3つはまったく同じ問題を引き起こし、交換には影響しません。4番目はまったく機能せず(構文エラー)、5番目は実際にはすべての後方参照が無視されます。また、次のように一重引用符と連結を使用してみました。

'config[\'$key\']$1=$2$3' . $value . '$4;',

繰り返しになりますが、前の3つの例と元のスクリプトと同じ問題が発生しました。

誰かがこれを以前に解決したか、少なくとも新しいアイデアを持っていることを願っています。

4

2 に答える 2

2

二重引用符の補間が混乱しているようです。この置き換えは機能します:

'config[\''.$key.'\']$1=$2${3}'.$value.'$4;'

また、次の (メタ文字) を適切にエスケープする必要があることに注意してください。

  • $keyとの正規表現でpreg_quote
  • $key代わりに$value、これを行うための組み込み関数はありません(preg_quoteエスケープが多すぎます)

また、存在する場合は、使用される正規表現区切り文字と引用符区切り文字もエスケープします。

于 2012-01-09T16:06:51.577 に答える
0

\g{1}グループ 1 (およびそれに応じて他のグループ) を試してください。

後方参照に関するphpマニュアルを参照してください

アップデート:

もちろん Qtax は正しいです。これは正規表現内の後方参照の構文です。(Qtax の場合は +1)

于 2012-01-09T15:50:18.867 に答える