我正在尝试编写一个正则表达式,在页面中搜索任何脚本标记并提取脚本内容,为了适应任何HTML编写样式,我希望我的正则表达式包含任意数量的空格的脚本标记字符(例如<script type = blahblah>
和<script type=blahblah>
都应该找到)。我的第一次尝试最终得到了时髦的结果,所以我将问题分解为更简单的问题,并决定只测试和使用像/ \ s * h \ s * / g这样的正则表达式。
当在字符串上测试时,出于某种原因,'h'周围的任意数量的空白将是匹配的,而其他任意数量都不会,例如像“h”这样的东西会匹配但“h”却不会。有没有人知道为什么会发生这种情况或我正在犯的错误?
答案 0 :(得分:2)
由于您使用的是JavaScript,为什么不能只使用getElementsByTagName('script')
?这就是你应该怎么做的。
如果您以某种方式拥有HTML字符串,请创建一个iframe并将HTML转储到其中,然后在其上运行getElementsByTagName('script')
。
答案 1 :(得分:0)
好的,为了扩展Kolink的答案,你不需要iframe或事件处理程序:
var temp = document.createElement('div');
temp.innerHTML = otherHtml;
var scripts = temp.getElementsByTagName('script');
...现在脚本是脚本元素的DOM集合 - 脚本不会被执行...
为什么正则表达式不是一个很棒的主意:
由于<script>
元素可能不包含字符串</script>
,因此编写正则表达式以匹配它们并不困难:/<script[.\n]+?<\/script>/gi
看起来您只想匹配具有特定类型属性的脚本。您也可以尝试将其包含在您的模式中:/<script[^>]+type\s*=\s*(["']?)blahblah\1[.\n]*?<\/script>/gi
- 但这太可怕了。 (当你在不规则字符串上使用正则表达式时,就会发生这种情况,你需要简化)
因此,您遍历所有基本匹配的脚本,提取起始标记:result.match(/<script[^>]*>/i)[0]
并在其中搜索您的类型属性/type\s*=\s*((["'])blahblah\2|\bblahblah\b)/.test(startTag)
。哦,看起来 - 它又回到了可怕的地方 - 简化!
这次通过标准化:
startTag = startTag.replace(/\s*=\s*/g, '=').replace(/=([^\s"'>]+)/g, '="$1"')
- 现在你处于危险区域,如果=
在引用的字符串中怎么办?你能看出它变得越来越复杂吗?
如果您对要使用它的HTML做出健全的假设(即使其成为常规),那么您只能使用正则表达式进行此工作。否则你的问题会成长,成长和成长!