繁体   English   中英

Javascript正则表达式空白是古怪的

[英]Javascript regex whitespace is being wacky

我正在尝试编写一个正则表达式,在页面中搜索任何脚本标记并提取脚本内容,并且为了适应任何HTML编写样式,我希望我的正则表达式包含任意数量的空白字符的脚本标记(例如应该找到<script type = blahblah><script type=blahblah> 我的第一次尝试最终得到了时髦的结果,所以我将问题分解为更简单的问题,并决定只使用像/ \\ s * h \\ s * / g这样的正则表达式来测试和使用。

当在字符串上测试它时,由于某种原因,'h'周围的任意数量的空白将是匹配的,而其他任意量都不会,例如“h”匹配但“h”不匹配。 有谁知道为什么会发生这种情况或我正在犯的错误?

既然你使用的是JavaScript,为什么不能只使用getElementsByTagName('script') 这就是你应该怎么做的。

如果您以某种方式拥有HTML字符串,请创建一个iframe并将HTML转储到其中,然后在其上运行getElementsByTagName('script')

好的,为了扩展Kolink的答案,你不需要iframe或事件处理程序:

var temp = document.createElement('div');
temp.innerHTML = otherHtml;
var scripts = temp.getElementsByTagName('script');

...现在脚本是脚本元素的DOM集合 - 脚本不会被执行...


为什么正则表达式不是一个很棒的主意:

由于<script>元素可能不包含字符串</script> ,因此编写正则表达式以匹配它们并不困难: </script> /<script[.\\n]+?<\\/script>/gi </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做出有力的假设(即使其成为常规),那么您只能使用正则表达式进行此工作。 否则你的问题会成长,成长和成长!

  • 免责声明:我没有测试任何正则表达式,看看他们是否做了我说他们做的事情,他们只是示例尝试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM