2

ServerNameとして定義された値を正規表現ServerAliasと一致させたい。DocumentRoot

先行#するものはすべて無視できます。

また、各仮想ホストの定義を個別に保持したいので、以下の例では 2 つの配列を使用します。

例:

<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\/\._-]+) ?)+)必要な値と一致しますが、個別の仮想ホスト/セット/アレイとしてではありません。

それらを一緒に接続するのに問題があります。

4

2 に答える 2

3

当初考えていたよりも多くのコードが必要でした。次のコードを検討してください。

$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);

出力:

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
        )
)
于 2013-10-24T17:42:38.010 に答える
0

これがperlバージョンです:

$in = 0;
while ($line = <>) {
  if ($line =~ m/<VirtualHost(?: \*\:[0-9]*)+>\s*/) {
    $in = 1;
  }
  if ($line =~ m/<\/VirtualHost>/) {
    $in = 0;
  }

  if ($in eq 1) {
    if (!($line =~ m/#/) && $line =~ m/(?:ServerName|ServerAlias|DocumentRoot) ((?:(?:[-\w\/.]+) ?)+)/) {
        print $1;
        print "\n";
    }
  }
}
于 2013-10-24T16:45:09.557 に答える