10

システムの INI ファイルに翻訳を保存していますが、次の方法で保存されています。

$ini=parse_ini_file('translations.ini',false,INI_SCANNER_RAW);

ドキュメントによると、この INI_SCANNER_RAW 設定は PHP に次のことを伝えます。

INI_SCANNER_RAW が指定されている場合、オプション値は解析されません。

技術的には、これは INI ファイル内の値を使用して解析を行うべきではないことを意味するため、INI ファイル内で何かを引用したりエスケープしたりする必要はありません。これらはすべて機能します:

example1="one"
example2=one
example1='one'
example3="double quotes ("value")"
example4=double quotes ("value")
example3='double quotes ("value")'

次のように出力されます。

one
one
one
double quotes ("value")
double quotes ("value")
double quotes ("value")

これでも機能します:

semi-colon1="ˇ1234567890+´õü'äö-.,<>~:_ÖÄ*PÕÜ`?=)(/&%¤#"!@£$€{[]}\½"

予想どおりに出力するもの:

ˇ1234567890+´õü'äö-.,<>~:_ÖÄ*PÕÜ`?=)(/&%¤#"!@£$€{[]}\½

しかし、ここに問題があります。INI 値にセミコロン (;) を追加した瞬間に、エスケープしようとしても解析が中断されます。

example1="semi-colon looks like (;) character"
example1="semi-colon looks like (\;) character"
example1="semi-colon looks like (\\;) character"
example1="semi-colon looks like (\\\;) character"

すべての出力は次のとおりです。

"semi-colon looks like (
"semi-colon looks like (
"semi-colon looks like (
"semi-colon looks like (

(二重引用符の代わりに単一引用符を使用する場合も同様です)

私の推測では、これはセミコロンがコメントの文字と見なされ、削除されてこのテキストのスニペットが残るためであると考えられます。終了引用符はセミコロンの後にあり、カプセル化されていないため、開始引用符はそこに残ります。

しかし、# は INI ファイルのコメント記号とも見なされるため、これはあまり意味がありません。

しかし、これはシステムにとって非常に深刻な問題です。INI ファイルの値の文字列にセミコロンを使用するにはどうすればよいでしょうか? これは PHP のバグですか、それとも予想される動作ですか?

これは、例外、通知、またはエラーもスローしません。

ありがとうございました!

4

1 に答える 1

13

これは既知のバグです:

PHP 5.4.5 で修正されました

PHP 5.3.15 で修正済み

于 2012-10-25T13:17:27.127 に答える