Question

J'ai une fonction qui exécute un regex généré par l'utilisateur. Cependant, si l'utilisateur entre une expression régulière qui ne s'exécute pas, elle s'arrête et tombe. J'ai essayé de placer la ligne dans un bloc Try / Catch mais hélas, rien ne se passe.

Si cela peut aider, j’exécute jQuery, mais le code ci-dessous ne l’a pas, car je suppose qu’il est un peu plus fondamental que cela.

Éditer: Oui, je sais que je n’échappe pas au "[", c’est intentionnel et au but de la question. J'accepte les entrées de l'utilisateur et je souhaite trouver un moyen de résoudre ce type de problème sans que l'application ne tombe à plat.

<!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>
Était-ce utile?

La solution

Essayez ceci, le nouveau RegExp lève l'exception

        Regex

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

Autres conseils

Le problème vient de cette ligne:

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

'[' est un caractère spécial, il doit donc être échappé. De plus, cette ligne n'est pas encapsulée dans try ... catch, vous obtenez donc toujours l'erreur.

Modifier : vous pouvez également ajouter un

.
alert(e.message);

dans la clause catch pour voir le message d'erreur. C'est utile pour toutes sortes d'erreurs en javascript.

Modifier 2 : OK, je devais lire plus attentivement la question, mais la réponse est toujours là. Dans l'exemple de code, la ligne incriminée n'est pas encapsulée dans le bloc try ... catch. Je l'ai mis là et je n'ai pas eu d'erreur dans Opera 9.5, FF3 et 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');

placer l'initialisation RegExp dans try / catch fonctionnera (vient d'être testé dans 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

S'échapper ici n'est pas la solution. Étant donné que le but de cet extrait est de tester réellement un RegExpr généré par l'utilisateur, vous souhaiterez capturer [comme un conteneur RegExpr non fermé.

votre RegExp ne ferme pas le [

Dans mon FireFox, cela ne revient jamais du constructeur - cela ressemble à un bogue dans l'implémentation de RegExp, mais si vous fournissez une expression valide, cela fonctionne

Une option consiste à valider les expressions générées par l'utilisateur. C'est; les caractères d’échappement que vous savez bloqueront votre script.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top