preg_match_all使用 PHP preg_match_all从 httpd-vhosts.conf 文件 xa



这是我尝试过的,我也不想用#/##注释的主机和解释

$str = '# Virtual Hosts
#
# Required modules: mod_log_config
# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at 
# <URL:http://httpd.apache.org/docs/2.4/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.
#
# Use name-based virtual hosting.
#
##NameVirtualHost *:80
#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ##ServerName or ##ServerAlias in any <VirtualHost> block.
#
##<VirtualHost *:80>
##ServerAdmin webmaster@dummy-host.example.com
##DocumentRoot "D:/xampp/htdocs/dummy-host.example.com"
##ServerName dummy-host.example.com
##ServerAlias www.dummy-host.example.com
##ErrorLog "logs/dummy-host.example.com-error.log"
##CustomLog "logs/dummy-host.example.com-access.log" common
##</VirtualHost>
##<VirtualHost *:80>
##ServerAdmin webmaster@dummy-host2.example.com
##DocumentRoot "D:/xampp/htdocs/dummy-host2.example.com"
##ServerName dummy-host2.example.com
##ErrorLog "logs/dummy-host2.example.com-error.log"
##CustomLog "logs/dummy-host2.example.com-access.log" common
##</VirtualHost>

##<VirtualHost *:8080>
##ServerName CI1
##DocumentRoot D:xampphtdocscodeigniter_1public
##</VirtualHost>
<VirtualHost *:8080>
ServerName CI2
DocumentRoot D:xampphtdocscodeigniter_2public
</VirtualHost>
<VirtualHost *:8080>
ServerName CI3
DocumentRoot D:xampphtdocscodeigniter_3public
</VirtualHost>';

模式 1

$pattern1 = "#<s*?$tagnameb[^>]*>(.*?)</$tagnameb[^>]*>#s";
preg_match_all($pattern1, $str, $match);

模式 2

$pattern2 = "/^(?<!#).*<$tagname.*>(.+?)</tagname>/mis";
preg_match_all($pattern2, $str, $matches);

功能

function everything_in_tags($str, $tagname)
{
$pattern1 = "#<s*?$tagnameb[^>]*>(.*?)</$tagnameb[^>]*>#s";
preg_match_all($pattern1, $str, $match);

$pattern2 = "/^(?<!#).*<$tagname.*>(.+?)</$tagname>/s";
preg_match_all($pattern2, $str, $matches);

echo '<pre>',print_r($match[1]),'</pre>';

echo '<pre>',print_r($matches[1]),'</pre>';
}
everything_in_tags($str, $tagname);

模式 1 的输出

Array
(
[0] =>  block.
#
##
##ServerAdmin webmaster@dummy-host.example.com
##DocumentRoot "D:/xampp/htdocs/dummy-host.example.com"
##ServerName dummy-host.example.com
##ServerAlias www.dummy-host.example.com
##ErrorLog "logs/dummy-host.example.com-error.log"
##CustomLog "logs/dummy-host.example.com-access.log" common
##
[1] => 
##ServerAdmin webmaster@dummy-host2.example.com
##DocumentRoot "D:/xampp/htdocs/dummy-host2.example.com"
##ServerName dummy-host2.example.com
##ErrorLog "logs/dummy-host2.example.com-error.log"
##CustomLog "logs/dummy-host2.example.com-access.log" common
##
[2] => 
##ServerName CI1
##DocumentRoot D:xampphtdocscodeigniter_1public
##
[3] => 
ServerName CI2
DocumentRoot D:xampphtdocscodeigniter_2public
[4] => 
ServerName CI3
DocumentRoot D:xampphtdocscodeigniter_3public
)

模式 2 的输出

Array
(
[0] => 
ServerName CI3
DocumentRoot D:xampphtdocscodeigniter_3public
)

期望的输出

Array
(
[0] => array(
[ServerName] : CI2
[DocumentRoot] : D:xampphtdocscodeigniter_2public
),
[1] => array(
[ServerName] : CI3
[DocumentRoot] : D:xampphtdocscodeigniter_3public
);
)

任何帮助将不胜感激,因为我是正则表达式的新手.....我也不需要任何用#/##注释的字符串,提前感谢..

用作正则表达式:

'~^s*<VirtualHosts+[^>]*>s*ServerNames+(?P<ServerName>S+)s*DocumentRoots+(?P<DocumentRoot>S+)s*</VirtualHost>~m'

然后,您需要的内容将在捕获组 1/"服务器名称"和 2/"文档根"中。

解释:

  1. ^- 将行首与m标志集匹配。
  2. s*- 匹配 0 个或多个空格字符。
  3. <VirtualHost- 匹配"<虚拟主机"。>
  4. s+- 匹配 1 个或多个空格字符。
  5. [^>]*匹配 0 个或多个非">"字符。
  6. >- 匹配">"。
  7. s*- 匹配 0 个或多个空格字符。
  8. ServerName- 匹配"服务器名称"。
  9. s+- 匹配 1 个或多个空格字符,
  10. (?P<ServerName>S+)- 匹配 1 个或多个非空格字符作为捕获组"服务器名称"。
  11. s*- 匹配 0 个或多个空格字符。
  12. DocumentRoot- 匹配"文档根"。
  13. s+- 匹配 1 个或多个空格字符,
  14. (?P<DocumentRoot>S+)- 匹配 1 个或多个非空格字符作为捕获组"文档根"。
  15. s*- 匹配 0 个或多个空格字符。
  16. </VirtualHost>- 匹配"。

查看正则表达式演示

代码:

$regex = '^s*<VirtualHosts+[^>]*>s*ServerNames+(?P<ServerName>S+)s*DocumentRoots+(?P<DocumentRoot>S+)s*</VirtualHost>~m';
preg_match_all($regex, $str, $matches, PREG_SET_ORDER);
print_r($matches);

指纹:

Array
(
[0] => Array
(
[0] =>
<VirtualHost *:8080>
ServerName CI2
DocumentRoot D:xampphtdocscodeigniter_2public
</VirtualHost>
[ServerName] => CI2
[1] => CI2
[DocumentRoot] => D:xampphtdocscodeigniter_2public
[2] => D:xampphtdocscodeigniter_2public
)
[1] => Array
(
[0] =>
<VirtualHost *:8080>
ServerName CI3
DocumentRoot D:xampphtdocscodeigniter_3public
</VirtualHost>
[ServerName] => CI3
[1] => CI3
[DocumentRoot] => D:xampphtdocscodeigniter_3public
[2] => D:xampphtdocscodeigniter_3public
)
)

更新

上面的正则表达式假定 DocumentRoot 规范不包含嵌入空格,但情况可能并非总是如此。它还有一个无关紧要的、不必要的s*,我已经删除了。我相信,以下正则表达式是一个改进。它替换S+,将 1 个或多个非空格字符与.+?匹配,这将非贪婪地匹配任何字符的 1 个或多个(换行符除外)。由于它后面跟着s*</VirtualHost>,由于它是非贪婪的,一旦它找到'就会停止匹配,可以选择在前面加上任何空格。

所以新的正则表达式将是(与m标志一起使用):

^s*<VirtualHosts+[^>]*>s*ServerNames+(?P<ServerName>S+)s*DocumentRoots+(?P<DocumentRoot>.+?)s*</VirtualHost>

查看新的正则表达式演示

$regex = '^s*<VirtualHosts+[^>]*>s*ServerNames+(?P<ServerName>S+)s*DocumentRoots+(?P<DocumentRoot>.+?)s*</VirtualHost>~m';
preg_match_all($regex, $str, $matches, PREG_SET_ORDER);
print_r($matches);

最新更新