Есть файл, читаю его через
$lines = file($file);
В нем следующая структура:
[/dep/1233/TRANS_UPD/En/Record/Stream/File]
Mode=false
Class=Pattern
DirectoryName=/123/124
Pattern=.*
Refresh=true
Нужно выбрать только [/dep/1233/TRANS_UPD/En/Record/Stream/File] и DirectoryName = /123/124
Через preg_match или preg_grep не могу задать, чтобы рассматривались все строки как одна (аналог /(\[.*\]).*(DirectoryName)/s)
Ну, Вы читаете файл через функцию file, и содержимое помещается в массив, но если вы хотите получить не массивом, то можно использовать функцию file_get_contents, после чего можно использовать preg_match_all для поиска нужных вам данных.
#1 Пример с file_get_contents:
preg_match_all('~\[.*?\]|DirectoryName=.*?\s~', file_get_contents($file), $matches);
print_r($matches[0]);
Получаем:
Array
(
[0] => [/dep/1233/TRANS_UPD/En/Record/Stream/File]
[1] => DirectoryName=/123/124
)
#2 Пример с file, лично у меня никак проблем не было найти нужные строки:
$matches = preg_grep('~\[[^]]*\]|DirectoryName=(.*?)~', $lines);
print_r($matches);
Получаем:
Array
(
[0] => [/dep/1233/TRANS_UPD/En/Record/Stream/File]
[4] => DirectoryName=/123/124
)
#3, upd: еще один вариант, слегка велосипед, но все же работает, хд
Имеем данные сразу нескольких конфигов, в одном из трех отсутствует DirectoryName
(в моем случае у меня все необходимое находится в переменной $string, но в вашем случае подключаете из файла через: $string = file_get_contents($file);
И так, рассмотрим:
$string = '
[/dep/1233/TRANS_UPD/En/Record/Stream/File]
Mode=false
Class=Pattern
DirectoryName=/123/124
Pattern=.*
Refresh=true
[/dep/1337]
Mode=false
Class=Pattern
Pattern=.*
Refresh=true
[/dep/File]
Mode=false
Class=Pattern
DirectoryName=test_name
Pattern=.*
Refresh=true
';
Далее делаем фильтрацию путем избавления от тех конфигов, в которых нет DirectoryName:
$exp = array_filter(explode('[', $string));
$tmp = '';
foreach ($exp as $value) {
$tmp .= (substr_count($value, 'DirectoryName') > 0) ? '['.($value) : null;
}
А далее действуем по первому примеру:
preg_match_all('~\[.*?\]|DirectoryName=.*?\s~', $tmp, $matches);
print_r($matches[0]);
Получаем нужный нам результат:
Array
(
[0] => [/dep/1233/TRANS_UPD/En/Record/Stream/File]
[1] => DirectoryName=/123/124
[2] => [/dep/File]
[3] => DirectoryName=test_name
)
Демо последнего примера.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости