我已经编写了以下PCRE正则表达式来从HTML页面中删除脚本:<script.*?>[\s\S]*?< *?\/ *?script *?>
适用于许多在线PCRE正则表达式测试人员:
https://regex101.com/r/lsxyI6/1
https://www.regextester.com/?fam=102647
当我在bash终端中运行以下perl替换命令时,它 NOT 工作:cat tmp.html | perl -pe 's/<script.*?>[\s\S]*?< *?\/ *?script *?>//g'
我正在使用以下测试数据:
<script>
$(document).ready(function() {
var url = window.location.href;
var element = $('ul.nav a').filter(function() {
if (url.charAt(url.length - 1) == '/') {
url = url.substring(0, url.length - 1);
}
return this.href == url;
}).parent();
if (element.is('li')) {
element.addClass('active');
}
});
</script>
P.S。我正在使用正则表达式解析HTML,因为当页面上有复杂的脚本时,我被迫使用的HTML解析器(xmlpath)会中断。我正在使用此正则表达式从页面中删除脚本,然后将其传递给解析器。
答案 0 :(得分:9)
你需要告诉perl不要将文件的每一行拆分成与-0
分开的单独记录。
perl -0 -pe 's/<script.*?>[\s\S]*?< *?\/ *?script *?>//g' tmp.html
这实际上告诉perl打破'\0'
上的记录。 perl -0777
会非常明确地诋毁整个文件。
答案 1 :(得分:3)
顺便说一下,因为我发现整个文件都令人讨厌,而且因为我不关心html对换行符的看法......更快,更清洁,更正确的方法 IF 您可以保证<script>
代码行中没有重要内容:
perl -ne 'print if !(/<script>/../<\/script>/)' tmp.html
(修改两个正则表达式,当然)
..
是一个有状态的运算符,在表达式为真之前由表达式翻转,在为真之后由表达式关闭。
~/test£ cat example.html
<important1/>
<edgecase1/><script></script><edgecase2/>
<important2/>
<script></script>
<important3/>
<script>
<notimportant/>
</script>
~/test£ perl -ne 'print if !(/<script>/../<\/script>/)' example.html
<important1/>
<important2/>
<important3/>
并且(主要)解决脚本标记行上的内容但外部标记:
~/test£ perl -ne 'print if !(/<script>/../<\/script>/);print "$1\n" if /(.+)<script>/;print "$1\n" if /<\/script>(.+)/;' example.html
<important1/>
<edgecase1/>
<edgecase2/>
<important2/>
<important3/>