我想匹配定义为的值ServerName
, ServerAlias
and DocumentRoot
用正则表达式。
任何带有前缀的内容#
可以忽略。
我还想将每个虚拟主机的定义分开,因此在下面的示例中我有两个数组。
Example:
<VirtualHost *:80>
ServerName foo.com
ServerAlias stage.foo.com new.foo.com
DocumentRoot /var/www/foo.com
</VirtualHost>
<VirtualHost *:80 *:443>
ServerName bar.com
ServerAlias store.bar.com
#ServerAlias new.bar.com us.bar.com
DocumentRoot /var/www/bar.com
</VirtualHost>
我的工作:
<VirtualHost(?: \*\:[0-9]*)+>\s*
将匹配每个虚拟主机的开头“标签”加上尾随空格。
[^\#](?:ServerName|ServerAlias|DocumentRoot) ((?:(?:[\w\/\._-]+) ?)+)
将匹配我需要的值,但不作为单独的虚拟主机/集/数组。
我无法将它们连接在一起。
它需要的代码比我最初想象的要多。考虑这段代码:
$s = <<< EOF
<VirtualHost *:80>
ServerName foo.com
ServerAlias stage.foo.com new.foo.com
DocumentRoot /var/www/foo.com
</VirtualHost>
<VirtualHost *:80 *:443>
ServerName bar.com
ServerAlias store.bar.com
#ServerAlias new.bar.com us.bar.com
DocumentRoot /var/www/bar.com
</VirtualHost>
EOF;
$vh = array();
if (preg_match_all('~<VirtualHost ([^>]+)>(.+?)</VirtualHost>~is', $s, $arr)) {
for($i=0; $i < count($arr[1]); $i++) {
if (preg_match_all('/^ *(ServerName|ServerAlias|DocumentRoot) +(.+)$/im',
$arr[2][$i], $m)) {
$entries = array();
for($j=0; $j < count($m[1]); $j++)
$entries[$m[1][$j]] = $m[2][$j];
$vh[$arr[1][$i]] = $entries;
}
}
}
print_r($vh);
OUTPUT:
Array
(
[*:80] => Array
(
[ServerName] => foo.com
[ServerAlias] => stage.foo.com new.foo.com
[DocumentRoot] => /var/www/foo.com
)
[*:80 *:443] => Array
(
[ServerName] => bar.com
[ServerAlias] => store.bar.com
[DocumentRoot] => /var/www/bar.com
)
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)