5

ユーザーが生成した正規表現を実行する関数があります。ただし、ユーザーが実行されない正規表現を入力すると、停止してフォールオーバーします。行を Try/Catch ブロックでラップしようとしましたが、残念ながら何も起こりません。

それが役立つ場合、私はjQueryを実行していますが、それよりも少し基本的であると推測しているため、以下のコードにはjQueryがありません。

編集:はい、「[」をエスケープしていないことはわかっています。これは意図的なものであり、質問のポイントです。私はユーザー入力を受け入れており、アプリケーションが顔を平らにすることなく、この種の問題をキャッチする方法を見つけたいと考えています。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
    <title>Regex</title>

    <script type="text/javascript" charset="utf-8">
        var grep = new RegExp('gr[');

        try
        {
            var results = grep.exec('bob went to town');
        }
        catch (e)
        {
            //Do nothing?
        }

        alert('If you can see this then the script kept going');
    </script>
</head>
<body>

</body>
</html>
4

6 に答える 6

17

これを試してください新しい正規表現が例外をスローしています

正規表現

    <script type="text/javascript" charset="utf-8">
            var grep;

            try {
                    grep = new RegExp("gr[");
            }
            catch(e) {
                    alert(e);

            }
            try
            {
                    var results = grep.exec('bob went to town');
            }
            catch (e)
            {
                    //Do nothing?
            }

            alert('If you can see this then the script kept going');
    </script>

于 2008-09-23T12:42:05.300 に答える
8

問題は次の行にあります。

var grep = new RegExp('gr[');

「[」は特殊文字なので、エスケープする必要があります。また、この行は try...catch でラップされていないため、引き続きエラーが発生します。

編集:追加することもできます

alert(e.message);

catch 句でエラー メッセージを表示します。JavaScript のあらゆる種類のエラーに役立ちます。

編集 2 : OK、質問をもっと注意深く読む必要がありましたが、答えはまだそこにあります。コード例では、問題のある行は try...catch ブロックでラップされていません。そこに置いたところ、Opera 9.5、FF3、および IE7 でエラーは発生しませんでした。

于 2008-09-23T12:37:39.397 に答える
4
var grep, results;

try {
    grep = new RegExp("gr[");
    results = grep.exec('bob went to town');
}
catch(e) {
    alert(e);
}
alert('If you can see this then the script kept going');
于 2008-09-23T12:55:55.983 に答える
2

RegExp の初期化を try/catch 内に配置すると機能します (FireFox でテスト済み)。


var grep, results;

try
{
    grep = new RegExp("gr["); // your user input here
}
catch(e)
{
    alert("The RegExpr is invalid");
}

// do your stuff with grep and results

ここで逃げることは解決策ではありません。このスニペットの目的は、ユーザーが生成した RegExpr を実際にテストすることであるため、[ をクローズされていない RegExpr コンテナーとしてキャッチする必要があります。

于 2008-09-23T15:37:29.777 に答える
1

あなたの正規表現は [ を閉じません

私の FireFox では、コンストラクタから返されることはありません - RegExp の実装のバグのように見えますが、有効な式を指定すると動作します

于 2008-09-23T12:38:15.230 に答える
0

1 つのオプションは、ユーザーが生成した式を検証することです。あれは; スクリプトを失速させることがわかっているエスケープ文字。

于 2008-09-23T12:54:04.257 に答える