我将翻译存储在系统中的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中的错误还是预期的行为?
这不会引发异常或通知或错误。
谢谢!
答案 0 :(得分:12)