Есть файл, читаю его через
$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
)
Демо
последнего примера.
Виртуальный выделенный сервер (VDS) становится отличным выбором
делаю приложение на yii2-advanced, настраиваю доступ к бэкэнду для админапосле того как выставляю права сбивается ссылка на админку и выскакивает...