我需要在html页面中获取内联脚本标记。 正则表达式最终将由c#驱动。 现在我正在使用Expresso进行测试。
以下是目前最好的:
.*<script.*\r\n(.*\r\n)*\s*</script>
即
.*<script
抓住脚本标记.*\r\n
抓住任何东西直到行尾(.*\r\n)*
抓住剧本的其他部分\s*</script>
抓住结束脚本,前面有任何缩进它抓取第一个标记之间的所有内容,包含html和其他脚本标记。
答案 0 :(得分:4)
同一行上的两个脚本会破坏你的正则表达式。在您的问题的页面源上尝试它。
使用正则表达式解析HTML不是一个好主意(在您的问题的评论中有一个链接answers为什么 <center>
无法容纳< / em>的);改为使用HTML解析器。
下一个代码段使用HtmlAgilityPack:
选择<script>
个节点
var doc = new HtmlDocument();
doc.Load(html);
var scripts = doc.DocumentNode.SelectNodes("//script");
这不是比正则表达式更简单吗?
答案 1 :(得分:1)
如何启用&#34;点匹配所有&#34;并使用简单的东西:
<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
答案 2 :(得分:1)
根据您的要求,您有不同的问题。你的问题是,你在html上使用正则表达式,或者你的量词太贪心。
我不知道你想要解决的问题,但很可能,你的解决方案应该是使用html解析器。
如果您想坚持使用正则表达式,请使用量词*?
的ungreedy版本。你的正则表达式看起来像这样
.*<script.*\r\n(.*\r\n)*?\s*</script>
这意味着它将匹配所需的行数,直到第一个结束标记为止。
答案 3 :(得分:0)
<(?<tag>script*)[^>]*>(?<content>.*?)<\/\k<tag>>
将script
之后的单词<tag>
替换为其他元素名称,您也可以将其用于其他元素名称。