跨多个网站有条件地评论 html 脚本语句
Conditionally comment html script statement across mulitple websites
我有几个网站,每个网站都有多个页面。这些页面中的每一个都有多个脚本用于各种功能。我试图在所有网站上注释掉一个特定的脚本。
我要注释掉的脚本有一个目标词,我可以将其用作条件词以将其与其余部分隔离开来。我想用那个词来定位脚本并将所有脚本(大约 10 行/包括 <script>
标签本身)包装在评论中。
我考虑过使用正则表达式,但似乎脚本语法的多行和复杂特性可能使正则表达式解决方案无法解决这种情况。我不精通正则表达式,所以我可能是错的。
这里粗略的说一下需要注释掉的地方。我想保留的是其他没有条件词的类似脚本块(在本例中 "oranges.com"):
<script type='text/javascript'>
window.__wtw_lucky_site_id = 15001;
(function() {
var wa = document.createElement('script'); wa.type = 'text/javascript'; wa.async = true;
wa.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://ww7632') + '.oranges.com/w.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(wa, s);
})();
</script>
我想还值得一提的是,我将通过 ssh 访问和操作这些文件,因此该解决方案最好能以某种方式与之兼容。
您可以使用 Perl 来完成此操作(您要评论的脚本中包含 stuff
):
$ cat test.xml
<html>
<script>
stuff
</script>
<script>
other things
</script>
<body>
<h1>Hello, world!</h1>
</body>
</html>
$ perl -0pe 's/<script([^>]*>.*?stuff.*?)<\/script>/<!-- script<\/script -->/smg' test.xml
<html>
<!-- script>
stuff
</script -->
<script>
other things
</script>
<body>
<h1>Hello, world!</h1>
</body>
</html>
有关参考,请参阅 here。这是一个非常快速和肮脏的解决方案。您还可以编写一个脚本来从根本上用任意数量的库解析 XML,遍历元素并修改 XML。
可能有一种 XSLT 方法,但我没能找到一种看起来特别直接的方法。
对您的文件尝试以下 perl
解决方案:
perl -0777 -p -e 's/(<script.*?orange.*?<\/script>)/\/\*\*\///s' file
perl 将匹配所有具有以下格式的多行模式:
<script ...
...
</script>
然后检查单词 orange
是否出现在匹配模式中的任何行上。如果是,则后向引用 </code> 将匹配的模式替换为自身,唯一的区别是 <code>/*
在开头添加, */
在结尾添加。所以输出看起来像:
/*<script ...
...
</script>*/
或者
您也可以使用 python
脚本来获得相同的结果:
import sys
import re
file = sys.argv[1]
f = open(file, 'r')
a = f.read() #read file into string
change = re.sub('(<script.*?orange.*?<\/script>)', r'/**/', a, flags=re.DOTALL) #flag DOTALL includes newline
print(change)
您可以 运行 脚本如下:
python script.py file > newfile
cat newfile > file
这会用所需的输出覆盖文件的内容。
我有几个网站,每个网站都有多个页面。这些页面中的每一个都有多个脚本用于各种功能。我试图在所有网站上注释掉一个特定的脚本。
我要注释掉的脚本有一个目标词,我可以将其用作条件词以将其与其余部分隔离开来。我想用那个词来定位脚本并将所有脚本(大约 10 行/包括 <script>
标签本身)包装在评论中。
我考虑过使用正则表达式,但似乎脚本语法的多行和复杂特性可能使正则表达式解决方案无法解决这种情况。我不精通正则表达式,所以我可能是错的。
这里粗略的说一下需要注释掉的地方。我想保留的是其他没有条件词的类似脚本块(在本例中 "oranges.com"):
<script type='text/javascript'>
window.__wtw_lucky_site_id = 15001;
(function() {
var wa = document.createElement('script'); wa.type = 'text/javascript'; wa.async = true;
wa.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://ww7632') + '.oranges.com/w.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(wa, s);
})();
</script>
我想还值得一提的是,我将通过 ssh 访问和操作这些文件,因此该解决方案最好能以某种方式与之兼容。
您可以使用 Perl 来完成此操作(您要评论的脚本中包含 stuff
):
$ cat test.xml
<html>
<script>
stuff
</script>
<script>
other things
</script>
<body>
<h1>Hello, world!</h1>
</body>
</html>
$ perl -0pe 's/<script([^>]*>.*?stuff.*?)<\/script>/<!-- script<\/script -->/smg' test.xml
<html>
<!-- script>
stuff
</script -->
<script>
other things
</script>
<body>
<h1>Hello, world!</h1>
</body>
</html>
有关参考,请参阅 here。这是一个非常快速和肮脏的解决方案。您还可以编写一个脚本来从根本上用任意数量的库解析 XML,遍历元素并修改 XML。
可能有一种 XSLT 方法,但我没能找到一种看起来特别直接的方法。
对您的文件尝试以下 perl
解决方案:
perl -0777 -p -e 's/(<script.*?orange.*?<\/script>)/\/\*\*\///s' file
perl 将匹配所有具有以下格式的多行模式:
<script ...
...
</script>
然后检查单词 orange
是否出现在匹配模式中的任何行上。如果是,则后向引用 </code> 将匹配的模式替换为自身,唯一的区别是 <code>/*
在开头添加, */
在结尾添加。所以输出看起来像:
/*<script ...
...
</script>*/
或者
您也可以使用 python
脚本来获得相同的结果:
import sys
import re
file = sys.argv[1]
f = open(file, 'r')
a = f.read() #read file into string
change = re.sub('(<script.*?orange.*?<\/script>)', r'/**/', a, flags=re.DOTALL) #flag DOTALL includes newline
print(change)
您可以 运行 脚本如下:
python script.py file > newfile
cat newfile > file
这会用所需的输出覆盖文件的内容。