У меня есть куча файлов 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>
, Я верю.
Любая помощь будет принята с благодарностью. Лучший!
Вы можете использовать
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+ символов, кроме символов разрыва строки;
— а ;
,$
— конец строкиДругих решений пока нет …