0
$so = file_get_contents(...) ;
$so = preg_replace("/\*([^*]+)\*/e", constant(\1), $so) ;

アスタリスク間のテキストを同じ名前の定数に置き換えようとしていますが、予期しない T_LNUMBER が発生し続けます。私は何を間違って書いていますか?$so が文字列として存在することを確認したところ、すべての定数がプレーン テキストとして存在します。

私はおそらくこのスクリプトを使用しませんが、私が台無しにしていることに興味がありました

4

5 に答える 5

5

試すpreg_replace_callback("/\*([^*]+)\*/e", create_function('$matches','return constant($matches[1]);'), $so)

PHP には無名関数があるのではないかといつも思っていましたが、それらを使用する必要はありませんでした。これはより良いものです:

preg_replace_callback("/\*([^*]+)\*/e", function($matches){
    return constant($matches[1]);
}, $so)

編集: 以下のコメントで指摘されているように、返された値のコードを評価する必要がないため、コールバックを使用している場合は \e 修飾子は不要です。

于 2012-10-16T19:54:00.700 に答える
1

The correct way to do that is:

$so = preg_replace_callback("/\*([^*]+)\*/", function($m){return constant($m[1])}, $so);

Your constant(\1) doesn’t make any sense in php.

于 2012-10-16T19:56:10.810 に答える
0

変数への T_LNUMBER リファラー。数字で始まる変数に名前を付けることはできません。 phpコーデックス

于 2012-10-16T19:57:31.650 に答える
0

あなたが言ったように、後方参照にはより適切に使用されますが、同じ正規表現で、に$1置き換える必要があります。\1

于 2012-10-16T19:53:49.627 に答える
0

問題は、コードの評価方法にあります。

この線:

preg_replace("/\*([^*]+)\*/e", constant(\1), $so) ;

次のようにする必要があります。

$so = preg_replace("/\*([^*]+)\*/e", "constant('\\1')", $so) ;

constant()渡された値は、文字列として扱われるように引用符で囲む必要があります。さらに、後方参照が評価されるように、2 番目の引数を引用符で囲みます。

于 2012-10-16T19:56:37.857 に答える