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[.'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 做出稳健的假设(即使其常规)时,你才能使用正则表达式来完成这项工作。 否则你的问题会越来越大,越来越大!
- 免责声明:我没有测试任何用于查看它们是否按照我所说的方式执行的正则表达式,它们只是示例尝试。
- 正则表达式搜索一个空格,后跟一个字符
- 较短的正则表达式,按2个条件拆分,外部有空格
- 正则表达式,用于去掉逗号后的单个空格
- 正则表达式允许字母数字和空格,但不允许连续两个空格
- 正则表达式和 javascript:匹配数字后跟空格和大写字母之间的所有内容
- 正则表达式匹配空白或空格 JavaScript
- 字符串替换正则表达式,开头为空格
- 如何在正则表达式中匹配空格、换行符
- 为什么当我在正则表达式中放置空格键时,我的 Javascript test() 函数失败了
- 用于匹配带空格和不带空格的多个单词的正则表达式
- 正则表达式,用于除所有空格和一个特殊字符之外的所有内容
- 使用正则表达式获取多个单词,单词之间留有空格
- 如何使正则表达式接受ONLY字母表和空格
- Javascript正则表达式,返回连字符和空格后面的数字
- JS正则表达式匹配单词,包括用空格括起来的单词
- 需要帮助设计正则表达式来选择'|'和'|'如果第一个'|'后面跟着一个空格
- 在搜索表单中,替换空格或仅使用正则表达式的隐词和数字
- 在jQuery源码中理解空格正则表达式
- 带有空格正则表达式的字母数字
- 字母数字,破折号和下划线,但没有空格正则表达式检查JavaScript