Как распарсить phpinfo to array

Однажды мы допустили ошибку, которую заметили только спустя пару месяцев. Перед программистом в нашей команде стояла задача: проанализировать настройки сервера (php.ini) и сделать определённые выводы о совместимости с нашим софтом. “Сложность” была в том, что сделать это нужно было внутри php-скрипта, то есть без возможности куда-то положить phpinfo. Шутки ради в тот же день я поручил эту задачу в качестве первого тестового задания стажёру, которого занесла к нам учебная практика. Стажёр промучался с задачей четыре часа, затем исчез и больше никогда не появлялся в нашей жизни. Возможно, он решил навсегда завязать с программированием. И вот тогда я забеспокоился всерьёз.

А случилось вот что: на официальном сайте PHP в комментариях к функции phpinfo были приведены различные регулярки (регекспы), которыми добрые самаритяне делились со всеми желающими. Эти волшебные регулярные выражения парсили выдачу phpinfo и выдавали на выход массив его свойств. Наши ребята, не долго думая, взяли самую приличную регулярку и воткнули в код. Работает? Работает, протестили определение ряда ключевых значений и успокоились. А она работала, но не вся: совершенно непонятным, непредсказуемым и необъяснимым образом из всех нескольких десятков значений она не смогла прочитать значение ‘cURL enabled’. По сути, эта строка ничуть не отличается от всех остальных. Однако она не была прочитана.

В результате код был переписан совершенно дедовскими методами, зато он стал работающим:

ob_start();
phpinfo();
$p=ob_get_contents();
ob_end_clean();
preg_match_all('|<tr>(.+)</tr>|',$p,$m1);
$phpinfo_array=array();
foreach ($m1[0] as $m2)
{
 preg_match_all('|<td(.+?)>(.+?)</td>|',$m2,$m3);
 $phpinfo_array[]=$m3[2];
}

На выходе в массиве $phpinfo_array получаются подмассивы, в которых [0] элемент – название параметра, [1] элемент – значение. Когда значений два (local value и master value), то соответственно это [1] и [2] элементы.

Примечание: в значениях phpinfo иногда бывает html-код – что-то вроде <i>no value</i> или ещё хуже. Имейте в виду и не забудьте корректно распарсить такие значения.

Резюме: никогда не расслабляйтесь и не доверяйте рекомендациям даже с официальных сайтов. А невозможность получения phpinfo в формате XML или в массиве штатными средствами – можно назвать самым большим позором этого языка.