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 回答