[英]Trying to get perl regex to find multi-line AND single-line HTML comments
我试图在 HTML 文件中找到单行和多行注释。 我已将其精简为几个示例,以及一些其他内容,只是为了在其中提供一些内容。
我在这里阅读了很多条目,但无法得到明确的答案。 我正在以“slurp”模式读取 HTML 文件,并匹配我的模式。 此代码现在运行并仅打印第一个匹配项。
#!C:\Perl\bin\perl.exe
BEGIN { unshift @INC, 'C:\rmhperl'; }
use warnings;
no warnings 'uninitialized';
chdir 'c:\watts\html';
open FILE, "test.html" or print 'error opening file "test.html" ';
my $text = do { local $/; <FILE> };
close(FILE);
if ($text =~ m/(?s)(<!--.*?)(-->\n)/sg) {
print "1 = $1 2= $2\n";
}
exit;
我已经在 HTML 文件中设置了单行和多行注释。 我可以打印一个或另一个,但不能同时打印(至少在“slurp”模式下)。
有人告诉我我应该能够用一个正则表达式来完成这个,所以目标是“找到所有 HTML 注释,不管它们是单行/多行注释” 。
我构建了正则表达式来查找两者,但只找到第一个匹配项——多行注释。
我试图找到一种方法来查找每个匹配项,无论它出现在一行还是多行。 我可以找到其中一个,但我无法让它们使用一个正则表达式。
我可以做非 slurp 模式,找到<!--
标签,然后循环直到看到-->
标签,但想看看我是否可以让它与单个正则表达式一起工作。
我一直在阅读这个,并试图找到相关的例子。 看不到我错过了什么。 这是我一直用于正则表达式的 HTML 文件片段:
<!DOCTYPE html>
<script type="text/javascript" src="fadeslideshow.js"></script>
<style>
.divTable {
display: block;
width: 100%;
}
.divTableBody, .divTableRow{ clear: both; }
.divTableCell {
border: 1px solid #999999;
float: left;
overflow: hide;
padding: 2%;
width: 45%; }
.divTable:after {
display: block;
font-size: 0;
content: " ";
clear: both;
height: 100px; }
</style>
<style type="text/css">
<!--
a:link {color: #0000ff;}
a:visited {color: #3563a8;}
a:active {color: #000000;}
a:hover {background-color: #000000;}
a {text-decoration: none;}
-->
</style>
</head>
<body class="home">
<div id="white_back">
<div style="text-align: center">
</div>
<div class="chromestyle" id="chromemenu">
<ul>
<!-- <li><a href="xyz.com">Home</a></li>
-->
<li><a href="#" rel="dropmenu0">About Us</a></li>
<li><a href="#" rel="dropmenu5">Publications</a></li>
</ul>
</div>
<!--1st drop down menu
-->
<div id="dropmenu0" class="dropmenudiv">
</div>
<!--2nd drop down menu -->
<div id="dropmenu1" class="dropmenudiv">
</div>
我认为这是生产代码,在这种情况下,您的经理是一个可怕的人,因为这种做法可能会导致难以发现的错误。 如果代码只为自己使用,那是可以接受的,但将其强加给他人是不公平的
关于您的代码的一些说明
shebang 行#!
在 Windows 系统上是不必要的,实际上除非您在那里指定命令行选项,否则什么都不做。 最好完全放弃
始终use strict
并use warnings 'all'
,并修复错误而不是禁用no warnings 'uninitialized'
BEGIN { unshift @INC, 'C:\\rmhperl' }
最好写成use lib 'C:\\rmhperl'
但在这种情况下你没有使用库所以它不会有任何影响
您应该使用具有open
的三参数形式的词法文件句柄
正则表达式模式中不需要(?s)
以及/s
修饰符。 除非你正在做一些奇特的事情,比如只为模式的一部分启用选项(你不是),否则如果你使用修饰符/s
人们会更好地理解你
您只找到一条评论的原因是您只要求一条评论。 在标量上下文中,全局正则表达式模式匹配将一次一个地遍历目标字符串中的所有匹配项。 你只调用一次,所以它只找到第一个。 您可以通过使用while
代替if
来解决此问题
我通过确保开头<--
后面没有>
或->
会形成非法的 HTML 注释来稍微改进您的正则表达式模式。 结束后也可能有可选的空间--
和>
所以我允许这样做。 而且你坚持在评论结束后换行,这可能不存在,所以我已经删除了
此代码似乎适用于您的数据
use strict;
use warnings 'all';
my $text = do {
open my $fh, '<', 'test.html' or print qq{Unable to open file "test.html" for input: $!};
local $/;
<$fh>;
};
while ( $text =~ /(<!--(?!-?>).*?--\s*>)/sg ) {
my $comment = $1;
print $comment, "\n";
}
<!--
a:link {color: #0000ff;}
a:visited {color: #3563a8;}
a:active {color: #000000;}
a:hover {background-color: #000000;}
a {text-decoration: none;}
-->
<!-- <li><a href="xyz.com">Home</a></li>
-->
<!--1st drop down menu
-->
<!--2nd drop down menu -->
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.