簡體   English   中英

正則表達式在HTML中捕獲多行腳本標記

[英]regex catching multiline script tag inside html

我需要抓取HTML頁面內的內聯腳本標簽。 正則表達式最終將由c#驅動。 現在,我將Expresso用於測試目的。

以下是目前最好的方法:

.*<script.*\r\n(.*\r\n)*\s*</script>

  • .*<script捕獲腳本標簽
  • .*\\r\\n抓到任何東西直到行尾
  • (.*\\r\\n)*捕獲腳本的其他行
  • \\s*</script>捕獲結束腳本,其前有任何縮進

它捕獲第一個標記之間的所有內容,包括html和其他腳本標記。

同一行上的兩個腳本將破壞您的正則表達式。 嘗試在頁面源上輸入您的問題。

用regex解析HTML 並不是一個好主意 (注釋中有一個鏈接指向您的問題,該鏈接回答 <center>為什么不能容納 )的問題; 請改用HTML解析器。

下一個代碼片段使用HtmlAgilityPack選擇<script>節點:

var doc = new HtmlDocument();
doc.Load(html);
var scripts = doc.DocumentNode.SelectNodes("//script");

這不是比正則表達式簡單嗎?

如何啟用“全部匹配”並使用簡單的方法:

<script\b[^>]*>(.*?)</script>

請記住,匹配與捕獲不同。 這應該捕獲($ 1)標簽之間的內容。 我使用http://regexpal.com/進行了快速測試

在Eclipse中使用bosinski.com/regex(我知道它不是C#),這是我的測試文件(后跟結果):

<html>
<SCRIPT LANGUAGE="JavaScript"><!--
function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}
// -->
</SCRIPT>
<script language="fred">
this is the second set of code
</script>
</html>

正則表達式匹配結果:

Found 2 match(es):

start=8, end=275
Group(0) = <SCRIPT LANGUAGE="JavaScript"><!--
function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}
// -->
</SCRIPT>
Group(1) = <!--
function demoMatchClick() {
  var re = new RegExp(document.demoMatch.regex.value);
  if (document.demoMatch.subject.value.match(re)) {
    alert("Successful match");
  } else {
    alert("No match");
  }
}
// -->

start=277, end=344
Group(0) = <script language="fred">
this is the second set of code
</script>
Group(1) = 
this is the second set of code

根據您問的人,您會遇到不同的問題。 您的問題是,您在html上使用了正則表達式,或者量詞過於貪婪。

我不知道您要解決的問題,但是很有可能,您的解決方案應該是使用html解析器。

如果要堅持使用正則表達式,請使用量詞*?的非貪婪版本*? 您的正則表達式將如下所示

.*<script.*\r\n(.*\r\n)*?\s*</script>

這意味着它將匹配到第一個結束標記之前所需的行數。

嘗試這個

<(?<tag>script*)[^>]*>(?<content>.*?)<\/\k<tag>>

<tag>之后的單詞script替換為另一個元素名稱,您也可以將其用於其他元素。

暫無
暫無

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM