質問

ユーザーが生成した正規表現を実行する関数があります。ただし、ユーザーが実行されない正規表現を入力すると、停止して終了します。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>
役に立ちましたか?

解決

新しい RegExp が例外をスローしているのでこれを試してください

正規表現

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

他のヒント

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

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

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

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

alert(e.message);

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

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

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');

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 コンテナーとしてキャッチする必要があります。

RegExp が閉じていません [

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

1 つのオプションは、ユーザーが生成した式を検証することです。あれは;エスケープ文字を使用するとスクリプトが停止する可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top