[英]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.