Как обработать файл .pls с помощью PHP? Проблемы с parse_ini_file

У меня есть этот файл:

 numberofentries=4 File1=http://108.61.73.119:8128 Title1=(#1 - 266/1000) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm Length1=-1 File2=http://108.61.73.118:8128 Title2=(#2 - 318/1000) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm Length2=-1 File3=http://108.61.73.117:8128 Title3=(#3 - 401/1000) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm Length3=-1 File4=http://198.27.79.224:9770 Title4=(#4 - 27/50) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm Length4=-1 Version=2 

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

Есть предположения?

PHP:

 $streams = parse_ini_file("tunein-station.pls", true); print_r($streams); 

Ошибка:

 PHP Warning: parse error in tunein-station.pls on line 4\n 

Попробуйте использовать сканер INI_SCANNER_RAW , что-то вроде этого:

 parse_ini_file('playlist.ini', true, INI_SCANNER_RAW); 

Это должно обрабатывать строки с пробелами и [] s без " вокруг них лучше». См. Режимы сканера в руководстве parse_ini_file() .

Кроме того, вы можете выполнить некоторую предварительную обработку входного файла, чтобы сделать его допустимым INI-файлом:

 <?php // 1. Read your INI file into a string (here we hardcode it for the demo) $str = <<<EOF [playlist] numberofentries=4 File1=http://108.61.73.119:8128 Title1=(#1 - 266/1000) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm Length1=-1 File2=http://108.61.73.118:8128 Title2=(#2 - 318/1000) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm Length2=-1 File3=http://108.61.73.117:8128 Title3=(#3 - 401/1000) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm Length3=-1 File4=http://198.27.79.224:9770 Title4=(#4 - 27/50) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm Length4=-1 Version=2 EOF; // 2. Add quotes around the "title" values $str = preg_replace('/^(Title\d+)=(.*)$/m', '\1="\2"', $str); // 3. Now parse as INI $array = parse_ini_string($str); // 4. Here are your results: print_r($array); ?> 

Демо-версия

Вывод:

 Array ( [numberofentries] => 4 [File1] => http://108.61.73.119:8128 [Title1] => (#1 - 266/1000) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm [Length1] => -1 [File2] => http://108.61.73.118:8128 [Title2] => (#2 - 318/1000) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm [Length2] => -1 [File3] => http://108.61.73.117:8128 [Title3] => (#3 - 401/1000) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm [Length3] => -1 [File4] => http://198.27.79.224:9770 [Title4] => (#4 - 27/50) 181.FM - POWER 181 -=[: The Hitz Channel :]=- www.181.fm [Length4] => -1 [Version] => 2 ) 

Единственное, что вы должны быть осторожны, это двойные кавычки в исходных значениях названия; вы можете использовать preg_replace_callback чтобы исправить это, если вам нужно.