2012-02-05 9 views
-3

------------- test.htaファイルコード------------なぜこのjavascriptのRegExp構文が無限ループになりますか?

<!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> 

----------- -code-末尾-------

なぜsrcRe.exec(txt)ループと死んでいるのですか?他のテスト文字列でも動作します。

srcRe私の平均は、それがHTML tagname.haveではないので>を終了していない、imgタグ名のsrcを取得し、ファイル名を取得するには、それを分割し、ないタグ名のsrcを得ることはありません、<b><img src="ss.gif" </b>のようなものです。

このSYNAX (?:\s[^<>]*(?:(?:'[^']*')|(?:"[^"]*"))?[^<>]*)*、平均値が<または>持っている場合、それは''または""でなければなりませんし、他の文字列がない<または>でなければなりません。そして>によって<、年末までに開始されます。

+0

ここでは、二重投票が必要なコメントです。 – gideon

+1

['TEXTAREA'](http://www.w3.org/TR/html4/interact/forms.html#edef-TEXTAREA)は、解析された文字データのみを許可しますが、他のマークアップは許可しません。 – Gumbo

+0

申し訳ありませんが、あなたが正規表現を使用している人は、その結果に値するでしょう。それは私が数週間で見たコードの中で最も理解できない行です。私は強く、それはあなたが持っている問題を持っていない、より多くの読みやすく、維持可能な別の方法(実際のJSをそれを解析する)を行うことを提案します。 – jfriend00

答えて

2

私はこのghastly正規表現をデバッグするつもりはありません。しかし、なぜそれが失敗するか教えてもらえます。 「読みやすさ」のためにそれを破壊:

< 
\w+ 
(?:\s[^<>]*(?:(?:'[^']*')|(?:"[^"]*"))?[^<>]*)* 
\s+src\s*\=\s*["']? 
(?:[^"' <>]*\/)? 
([^\/"'<>]+\.(?:gif|jpg|png)) 
['" ] 
(?:\s[^<>]*(?:(?:'[^']*')|(?:"[^"]*"))?[^<>]*)* 
\/? 
> 

あなたはあなたの文字列に.gifまたは.jpgまたは.pngがある場合にのみ一致させることができていることがわかります。それはないので、正規表現は失敗する必要があります。

文字列に[^<>]*という複数のインスタンスが存在するため、正規表現エンジンがこれを理解するのに時間がかかり、すべてがタグの内容全体を一致させることができます。傷害に侮辱を加える)、それらはすべて反復グループで囲まれている。分解、ライン3を参照してください。

(?: 
\s 
[^<>]*  # optional! 
(?: 
    (?:'[^']*') 
    | 
    (?:"[^"]*") 
)?   # optional! 
[^<>]*  # optional! 
)*   # optional! 

は、正規表現エンジンのすべてが失敗したことを宣言できるようになる前にチェックする必要が順列のgazillionsがあります。一言で言えば、無限ループではありませんが、このような入力を持つこのような正規表現は、地獄が凍結するまでコンピュータを忙しく保つのが好きです。

ヒント1:このチュートリアルをcatastrophic backtrackingでお読みください。
ヒント2:HTMLを解析するために正規表現を使用しないでください。少なくともあなたがいなければ、know exactly what you're doing

+0

''タグの 's.gif'を得る正規表現を書くことを意味します、' 'がタグに入っていることを確認してください。しかし、私のプロジェクトでは、 'regExp'でそれを行うのが難しいことが分かりました。私は、自分が望むことをするための簡単な正規表現を書くことができます。私の英語は非常に悪いです、致命的なバックトラッキングのウェブ、__次のコメントを参照してください – qidizi

+0

私は半分以上を理解することができます、 ''をregexp.thanksで実行します。 – qidizi

+0

別の方法は、 'innnerHTML'、' getElementsByTagName( '*') 'です。whice要素がimgであることを判断するために' for'を使い、次にsrcを取得します。 – qidizi

関連する問題