为什么javascript RegExp语法将是无限循环?
-------------test.hta文件代码-----------------为什么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
<!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!