Разбор файла INI с помощью PHP, когда точка с запятой (;) включена в значение

Я храню переводы в своем 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 или ожидаемое поведение?

Это также не вызывает исключения, уведомления или ошибки.

Благодарю вас!


person kingmaple    schedule 25.10.2012    source источник


Ответы (1)


Это известная ошибка:

Это было исправлено в PHP 5.4.5.

Также исправлено в PHP 5.3.15

person Gordon    schedule 25.10.2012
comment
Ура, по-видимому, это исправлено в более новых версиях PHP (с июня/июля 2012 года), но не повезло всем старым версиям. Я тоже сейчас нашел ссылку, но спасибо, это правильный ответ. (отметит как правильный, как только это позволит мне). - person kingmaple; 25.10.2012
comment
Эта ошибка снова появилась в версии PHP 5.6.11! - person m13r; 11.01.2017