我有一堆像这样的Nginx vhost文件:
# 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>
,我相信。
任何帮助将不胜感激。最好!
答案 0 :(得分:1)
您可以使用
preg_match('~server_name\h*(.*);~', $s, $match);
echo $match[1];
请参阅此regex demo
<强>详情
server_name
- 文字子字符串\h*
- 0+水平空格(.*)
- 第1组:除了换行符之外的任何0 +字符;
- ;
。实际上,我认为如果添加m修饰符,您的方法将起作用:
$_pattern = '/^.*server_name (.*);$/m';
请参阅this demo
*详细**:
^.*
- 开始一行,然后除了换行符之外的任何0 +字符server_name
- 文字子字符串
- space (.*)
- 第1组:除了换行符之外的任何0 +字符;
- ;
。$
- 行尾