匹配<script type="text/javascript">而不匹配<script type="text/html">的正则表达式

4

当前代码(无法运行):

/^script\s*type=\"text\/javascript/i.test(tagName)

7
需要使用正则表达式吗? - alex
2
放下起始锚。无论如何,请具体说明输入内容。在这种特殊情况下,.indexOf('j') > -1 就可以正常工作... - Ry-
感谢所有的答案。结果发现还有一个问题——tagName并没有包含我要查找的字符串(名字里就暗示了!),所以问题不仅仅是正则表达式...无论如何,你们帮助我找到了解决方案,所以谢谢。不确定应该选择哪个答案作为正确答案。 - Tom
5个回答

2

正则表达式和HTML——不好的事情。下面是一些示例,演示了正则表达式如何工作(别忘了单引号和双引号)。

<script type="text/javascript"> 
<script language="JavaScript" type="text/javascript"> 
<script type="text/javascript" language="JavaScript"> 
<script class="myJS" type="text/javascript"> 
<script type="text/javascript" class="myJS" > 

我建议使用像这样的函数来替代正则表达式:

function attr_in_str(str, tag, attr) {
    var div = document.createElement('div');
    div.innerHTML = str;

    var elems = div.getElementsByTagName(tag);
    for (var i = 0; i < elems.length; i++) {
        if (elems[i].type.toLowerCase() == attr.toLowerCase()) {
            return true;
        }
    }
    return false;
}

然后使用它:
var str = 'This is my HTML <script type="text/javascript"></script>';
var result = attr_in_str(str, 'script', 'text/javascript');

2
/<script\stype\=\"text\/javascript\">/i

1

我并不是正则表达式的忠实粉丝,所以我会这样做:

var temp = document.createElement('div');
temp.innerHTML = '<script type="text/html"></script>';

var type = temp.childNodes[0].getAttribute('type');

if (type == 'text/javascript') {
  // ...
}

如果您正在使用jQuery,则会简单得多:

if ($('<script type="text/html"></script>').prop('type') == 'text/javascript') {
  // ...
}

有没有一种浏览器可以真正执行JavaScript?如果是这样,这种方法可能会存在一定的安全风险。 - Ry-
绝对比正则表达式更好! - Derek 朕會功夫
1
@minitech:该元素未被附加到文档本身,因此我怀疑浏览器无法执行它。 - Blender

1

假设您在使用正则表达式处理HTML时已经了解了所有的假设。

您可以直接删除当前代码中的^,因为它匹配字符串的开头。

编辑

空格数量应至少为1,因此您应该将\s后面的*改为+


0
为了处理脚本标签中的'type'出现在任何位置以及多个引号版本的情况,请使用以下代码:
/<script.*?type\s*=\s*.text\/javascript./i

你可以通过指定所有的引号替代方案而不是“.”来使其更紧凑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接