1
我有這樣一羣Nginx的虛擬主機文件:grep命令在一個文件中的特定模式,並停止在第一場比賽
# 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
指令(在IE 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_grep'不重置指數,其與從原始數組的索引和值返回的確切項目。 –
'preg_grep'只是一個測試,看看實際上正在被grepped。我的實際目標是提取'server_name'和尾部';'之間的字符串。儘管感謝解決'preg_grep'的神祕。 – MacUsers
太棒了,那你爲什麼不按照你的要求去做呢? 'preg_match('〜server_name \ h *(。*);〜',$ s,$ match); echo $ match [1];'?實際上,我認爲如果你添加'm'修飾符,你的方法就可以工作:'$ _pattern ='/^.*server_name(。*); $/m';' - 參見[this demo](https:// regex101。 COM/R/dsTF5T/1)。 –