парсинг — чтение INI-файла из PHP, который содержит точки с запятой

Я должен прочитать конфигурационные файлы в PHP, которые содержат записи с точкой с запятой, например.

[section]
key=value;othervalue

Я замечаю что parse_ini_file() удаляет все точки с запятой и что следует, даже если установлено INI_SCANNER_RAW,

Файлы INI поступают из устаревших систем, и я не могу изменить формат. Я только должен их прочитать.

Какой инструмент лучше всего использовать, когда мне нужно сохранить записи с точкой с запятой?

0

Решение

Для INI-файлов ; является символом комментария.
Так что на самом деле это хорошая идея — не использовать это для чего-то другого.

Однако вы можете использовать эту слегка модифицированную функцию из найденных решений. Вот :

<?php
//Credits to goulven.ch AT gmail DOT com
function parse_ini ( $filepath )
{
$ini = file( $filepath );
if ( count( $ini ) == 0 ) { return array(); }
$sections = array();
$values = array();
$globals = array();

$i = 0;
foreach( $ini as $line ){
$line = trim( $line );
// Comments
if ( $line == '' || $line{0} == ';' ) { continue; }
// Sections
if ( $line{0} == '[' )
{
$sections[] = substr( $line, 1, -1 );
$i++;
continue;
}
// Key-value pair
list( $key, $value ) = explode( '=', $line, 2 );
$key = trim( $key );
$value = trim( $value );

if (strpos($value, ";") !== false)
$value = explode(";", $value);

if ( $i == 0 ) {
// Array values
if ( substr( $line, -1, 2 ) == '[]' ) {
$globals[ $key ][] = $value;
} else {
$globals[ $key ] = $value;
}
} else {
// Array values
if ( substr( $line, -1, 2 ) == '[]' ) {
$values[ $i - 1 ][ $key ][] = $value;
} else {
$values[ $i - 1 ][ $key ] = $value;
}
}
}
for( $j=0; $j<$i; $j++ ) {
$result[ $sections[ $j ] ] = $values[ $j ];
}
return $result + $globals;
}

Вы можете увидеть примеры использования по ссылке.

1

Другие решения

Я бы порекомендовал сначала прочитать файл в массив, преобразовать точки с запятой в pipe |, затем выложить это во временный файл и использовать parse_ini_file () с этим новым временным файлом.

Вот так…

$string = file_get_contents('your_file');

$newstring = str_replace(";","|",$string);

$tempfile = 'your_temp_filename';

file_put_contents($tempfile, $newstring);

$arrIni = parse_ini_file($tempfile);

Затем после этого вы всегда можете заменить каналы точкой с запятой при перечислении нового массива на основе INI.

4

По вопросам рекламы [email protected]