当值包含分号(;)时,使用PHP解析INI文件

kin*_*ple 9 php debugging ini parsing

我将翻译存储在我的系统中的INI文件中,并以这种方式存储:

$ini=parse_ini_file('translations.ini',false,INI_SCANNER_RAW);
Run Code Online (Sandbox Code Playgroud)

根据文档,这个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")'
Run Code Online (Sandbox Code Playgroud)

它们将输出为:

one
one
one
double quotes ("value")
double quotes ("value")
double quotes ("value")
Run Code Online (Sandbox Code Playgroud)

即便如此:

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

哪些输出可预测:

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

但这是一个问题.在我为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"
Run Code Online (Sandbox Code Playgroud)

所有的输出是:

"semi-colon looks like (
"semi-colon looks like (
"semi-colon looks like (
"semi-colon looks like (
Run Code Online (Sandbox Code Playgroud)

(如果我使用单引号而不是双引号,情况也是如此)

我最好的猜测是,这是因为分号被认为是评论的一个字符,所以它被删除了,它留下了这段文字.起始引号保留在那里,因为结尾引号在分号后面,因此它不是封装的.

但这没有多大意义,因为#也被认为是INI文件的注释符号.

但这对我的系统来说是一个非常严重的问题,如何在INI文件中的值字符串中使用分号?这是PHP中的错误还是预期的行为?

这不会引发异常或通知或错误.

谢谢!

Gor*_*don 12

这是一个已知的错误:

在PHP 5.4.5修复

也在PHP 5.3.15中修复

  • 仅供参考:这是在php5.4.5修复的更改日志http://php.net/ChangeLog-5.php (3认同)