为什么javascript RegExp语法将是无限循环?

为什么javascript RegExp语法将是无限循环?,javascript,regex,Javascript,Regex,-------------test.hta文件代码----------------- <!DOCTYPE html> <html> <head> <title>dead</title> </head> <body> txt<textarea id="content" > <input name="" type="text" class="qu_te1n05ew" valu

-------------test.hta文件代码-----------------

<!DOCTYPE html>
<html>
<head>
<title>dead</title>
</head>
<body>
txt<textarea id="content" >
            <input name="" type="text" class="qu_te1n05ew" value="请输入您的E-mail地址" />
           <input name="" type="submit" class="qu_sbt02" value="提 交" />
           </textarea>
<button onclick="startCls();">start</button>

<script>
function getObj(id) {
    return 'string' == typeof id ? document.getElementById(id) : id;
}

function startCls() {
    var txt = getObj('content').value;
    var srcRe = /<\w+(?:\s[^<>]*(?:(?:'[^']*')|(?:"[^"]*"))?[^<>]*)*\s+src\s*\=\s*["']?(?:[^"' <>]*\/)?([^\/"'<>]+\.(?:gif|jpg|png))['" ](?:\s[^<>]*(?:(?:'[^']*')|(?:"[^"]*"))?[^<>]*)*\/?>/ig;
    alert(srcRe.exec(txt));
}
</script>
</body>
</html>

死去的
文本
开始
函数getObj(id){
返回'string'==typeof-id?document.getElementById(id):id;
}
函数startCls(){
var txt=getObj('content')。值;
var srcRe=//ig;
警报(srcRe.exec(txt));
}
------------代码端-------

为什么
srcRe.exec(txt)
循环而hta死了?但是其他测试字符串可以工作。

srcRe
我的意思是获取一个
img
标记名的src,并将其拆分为文件名,但不要获取任何标记名的src,就像
,因为它不是html标记名。have not end


这个synax
(?:\s[^]*(?:(?:“[^']*”)|(?:“[^”]*”)*
,意思是如果有一个
,它必须在
'
中“
,其他字符串不能是
;并以
开头

我不打算调试这个可怕的正则表达式。但我可以告诉你为什么失败。将其细分为“可读性”:

在能够声明失败之前,正则表达式引擎必须检查数以百万计的排列。简言之,这不是一个无限循环,但像这样的正则表达式,输入这样的内容,会让你的计算机一直忙到死机

提示1:请在上阅读本教程。

提示2:不要使用正则表达式来解析HTML。如果你不这样做,至少不会这样。

现在这是一个需要双重投票的评论!只允许解析字符数据,不允许任何其他标记。抱歉,任何使用正则表达式的人都应该承担后果。这是我几周来看到的最不容易理解的代码行。我强烈建议你用另一种方法(编写实际的JS来解析它),它更可读、更易维护,并且不会有你现在遇到的问题。我的意思是写一个正则表达式来获取
标记的
s.gif
,有时可能也像
,但不要获取
,我只能理解一半以上;如果您想从html字符串中获取类似
的字符串,除了,使用
for
if
查找
s
,然后使用
r
,然后使用
c
…返回查找
另一种方法是
InnerHTML
然后
getElementsByTagName('*')
,并使用
for
确定哪个元素是img,然后得到它的src;
<
\w+
(?:\s[^<>]*(?:(?:'[^']*')|(?:"[^"]*"))?[^<>]*)*
\s+src\s*\=\s*["']?
(?:[^"' <>]*\/)?
([^\/"'<>]+\.(?:gif|jpg|png))
['" ]
(?:\s[^<>]*(?:(?:'[^']*')|(?:"[^"]*"))?[^<>]*)*
\/?
>
(?:
 \s
 [^<>]*       # optional!
 (?:
  (?:'[^']*')
  |
  (?:"[^"]*")
 )?           # optional!
 [^<>]*       # optional!
)*            # optional!