[英]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>
這意味着它將匹配到第一個結束標記之前所需的行數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.