我将翻译存储在系统中的 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 中的错误还是预期的行为?
这也不会引发异常、通知或错误。
谢谢!