Perl正则表达式在线PCRE测试员工作但不在perl命令中

时间:2018-02-28 19:35:38

标签: html regex bash perl pcre

我已经编写了以下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)会中断。我正在使用此正则表达式从页面中删除脚本,然后将其传递给解析器。

2 个答案:

答案 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/>