PHP - выбрать из файла через preg_match или preg_grep

190
28 ноября 2018, 23:40

Есть файл, читаю его через

$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)

Answer 1

Ну, Вы читаете файл через функцию 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
)

Демо последнего примера.

READ ALSO
Не могу зайти в backend

Не могу зайти в backend

делаю приложение на yii2-advanced, настраиваю доступ к бэкэнду для админапосле того как выставляю права сбивается ссылка на админку и выскакивает...

326
PHP Как перенести строку по второй запятой

PHP Как перенести строку по второй запятой

Есть текст №2 (644) 19 августа, пятница, 2018 год

149