簡體   English   中英

試圖讓 perl regex 找到多行和單行 HTML 注釋

[英]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 文件片段:

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 strictuse 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 -->

獲取 HTML 表標簽之間的所有文本(單行和多行)<table><tbody><tr><th></th></tr><tr><td> 並生成 json<div id="text_translate"><p> 我有下面的 HTML 表,我想獲取標簽之間的數據,這些標簽有時是單行,有時是多行。</p><pre> &lt;table&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th&gt;Role&lt;/th&gt; &lt;th&gt;Device Name&lt;/th&gt; &lt;th&gt;IP Address &lt;/th&gt; &lt;th&gt;MAC Address &lt;/th&gt; &lt;th&gt;Registered &lt;/th&gt; &lt;th&gt;Subscribers &lt;/th&gt; &lt;th&gt;Events &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; CM &lt;/td&gt; &lt;td&gt; - &lt;/td&gt; &lt;td&gt;192.168.7.110&amp;nbsp;&lt;/td&gt; &lt;td&gt;506182488323&amp;nbsp;&lt;/td&gt; &lt;td&gt;XYZ &lt;/td&gt; &lt;td&gt;&amp;nbsp;Shkdsd30ec1 &lt;/td&gt; &lt;td&gt;Events &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt;</pre><p> 我想使用此表生成 JSON,如下面的代碼,使用 javascript</p><pre> { "Role": "CM", "Device Name": "-", "IP Address": "192.168.7.110", "MAC Address": "506182488323", "Registered": "XYZ", "Subscribers": "Shkdsd30ec1", "Events": "Events" }</pre><p> 如果有更多帶有鍵的標簽應該像 Role-&gt;Role1-&gt;Role2 等一樣遞增。</p></div></td></tr></tbody></table>

[英]Get the all the text (single and multi-line) between HTML table tags <table><tbody><th><tr><td> and generate json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 用於多行HTML注釋的正則表達式(preg_match_all) 如何在多行左對齊的同時使單行文本中心對齊? 使用Perl正則表達式從HTML文件打印多行模式 單行換行的html代碼 JavaScript 正則表達式轉 select 多行 html 注釋 HTML中的多行按鈕 如何編寫多行RegEx表達式 RegEx用於匹配單行標准USPS地址 可編輯的單行輸入 獲取 HTML 表標簽之間的所有文本(單行和多行)<table><tbody><tr><th></th></tr><tr><td> 並生成 json<div id="text_translate"><p> 我有下面的 HTML 表,我想獲取標簽之間的數據,這些標簽有時是單行,有時是多行。</p><pre> &lt;table&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th&gt;Role&lt;/th&gt; &lt;th&gt;Device Name&lt;/th&gt; &lt;th&gt;IP Address &lt;/th&gt; &lt;th&gt;MAC Address &lt;/th&gt; &lt;th&gt;Registered &lt;/th&gt; &lt;th&gt;Subscribers &lt;/th&gt; &lt;th&gt;Events &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; CM &lt;/td&gt; &lt;td&gt; - &lt;/td&gt; &lt;td&gt;192.168.7.110&amp;nbsp;&lt;/td&gt; &lt;td&gt;506182488323&amp;nbsp;&lt;/td&gt; &lt;td&gt;XYZ &lt;/td&gt; &lt;td&gt;&amp;nbsp;Shkdsd30ec1 &lt;/td&gt; &lt;td&gt;Events &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt;</pre><p> 我想使用此表生成 JSON,如下面的代碼,使用 javascript</p><pre> { "Role": "CM", "Device Name": "-", "IP Address": "192.168.7.110", "MAC Address": "506182488323", "Registered": "XYZ", "Subscribers": "Shkdsd30ec1", "Events": "Events" }</pre><p> 如果有更多帶有鍵的標簽應該像 Role-&gt;Role1-&gt;Role2 等一樣遞增。</p></div></td></tr></tbody></table>
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM