这是我尝试过的,我也不想用#/##注释的主机和解释
$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/"文档根"中。
解释:
^
- 将行首与m
标志集匹配。s*
- 匹配 0 个或多个空格字符。<VirtualHost
- 匹配"<虚拟主机"。>s+
- 匹配 1 个或多个空格字符。[^>]*
匹配 0 个或多个非">"字符。>
- 匹配">"。s*
- 匹配 0 个或多个空格字符。ServerName
- 匹配"服务器名称"。s+
- 匹配 1 个或多个空格字符,(?P<ServerName>S+)
- 匹配 1 个或多个非空格字符作为捕获组"服务器名称"。s*
- 匹配 0 个或多个空格字符。DocumentRoot
- 匹配"文档根"。s+
- 匹配 1 个或多个空格字符,(?P<DocumentRoot>S+)
- 匹配 1 个或多个非空格字符作为捕获组"文档根"。s*
- 匹配 0 个或多个空格字符。</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);