Grep表示文件中的特定模式,并在第一个匹配时停止

时间:2016-12-07 22:44:13

标签: php regex pattern-matching preg-replace preg-grep

我有一堆像这样的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>,我相信。 任何帮助将不胜感激。最好!

1 个答案:

答案 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 +字符
  • ; - ;
  • $ - 行尾