Grep для определенного образца в файле и остановка при первом совпадении

У меня есть куча файлов Vhost Nginx, как это:

# This file was autogenerated by Puppet [ wordpress::vhost ]
# Any manual edit to this file will be automatically removed
# ©2016, DevOps team

server {
listen 443 ssl;

root /var/www/as888;
index index.php;

server_name wptraining-sdemo.mysysweb.com;
......
......

и мне нужно извлечь значение server_name директива (т.е. wptraining-sdemo.mysysweb.com в данном случае) из каждого файла. Я попробовал это, используя preg_replace:

$host_dir = '/etc/nginx/sites-enabled';
$_pattern = '/^.*server_name (.*);$/U';

$_clients = scandir($host_dir);
foreach ( $_clients as &$client ) {
if ( preg_match('/^as[0-9]{3}$/', $client, $matchs) ) {
$wp_domain = preg_replace($_pattern, "$1", file("{$host_dir}/{$matchs[0]}"));
echo "{$matchs[0]} => {$wp_domain[0]}";
}
}

и я получаю самую первую строку файла взамен:

as888 => # This file was autogenerated by Puppet [ wordpress::vhost ]

если я использую preg_grep вместо:

$wp_domain = preg_grep($_pattern, file("{$host_dir}/{$matchs[0]}"));
print_r($wp_domain);

Я получаю что-то вроде этого:

Array
(
[10] =>     server_name wptraining-sdemo.mysysweb.com;

)

что довольно странно для меня, как я ожидал [0] (так как будет только один матч) вместо [10], Похоже, он создает массив с каждой строкой в ​​файле.

что я делаю не так? И самое главное, чего мне не хватает? Я не очень знаком с PHP и немного потерян в этом. Ни одна из справок / постов, доступных в сети, не работала. В основном, что-то похожее на это: sed -n -e 's|^.*server_name \(.*\);$|\1|p' <file_name>, Я верю.
Любая помощь будет принята с благодарностью. Лучший!

1

Решение

Вы можете использовать

preg_match('~server_name\h*(.*);~', $s, $match);
echo $match[1];

Видеть это regex demo

подробности

  • server_name — буквальная подстрока
  • \h* — 0+ горизонтальных пробелов
  • (.*) — Группа 1: любые 0+ символов, кроме символов разрыва строки
  • ; — а ;,

На самом деле, я думаю, что ваш подход будет работать, если вы добавите модификатор m:

$_pattern = '/^.*server_name (.*);$/m';

Увидеть это демо

*Подробности**:

  • ^.* — начало строки, а затем любые 0+ символов, кроме символов разрыва строки
  • server_name — буквальная подстрока
  • — пространство
  • (.*) — Группа 1: любые 0+ символов, кроме символов разрыва строки
  • ; — а ;,
  • $ — конец строки
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]