Pergunta

Eu tenho uma função que executa um usuário gerado Regex. No entanto, se o usuário entra em um regex que não será executado em seguida, ele pára e cai. Eu tentei envolvendo a linha em um bloco try / catch, mas infelizmente nada acontece.

Se ajudar, eu estou correndo jQuery mas o código abaixo não tê-lo como eu estou supondo que é um pouco mais fundamental do que isso.

Edit: Sim, eu sei que não estou fugindo da "[", que é intencional e o ponto da questão. Estou aceitando a entrada do usuário e quero encontrar uma maneira de travar este tipo de problema sem a cair de aplicação nele é cara.

<!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>
Foi útil?

Solução

Tente este novo RegExp é lançar a exceção

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>

Outras dicas

O problema é com esta linha:

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

'[' é um caractere especial para que ele precisa ser escapado. Também esta linha não é envolto em try ... catch, assim você ainda obter o erro.

Editar : Você também pode adicionar um

alert(e.message);

na cláusula catch para ver a mensagem de erro. É útil para todos os tipos de erros em javascript.

Editar 2 : OK, eu precisava ler mais atentamente a questão, mas a resposta ainda está lá. No código de exemplo a linha ofensiva não é envolvida no bloco try ... catch. Eu colocá-lo lá e não obter erros no Opera 9.5, FF3 e 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');

colocando a inicialização RegExp dentro do try / catch irá funcionar (apenas testada no 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

Escapando aqui não é a solução. Uma vez que o objectivo deste trecho é de realmente testar um RegExpr gerado pelo usuário, você vai querer pegar [como um recipiente RegExpr não fechada.

seu RegExp não fecha a [

Na minha FireFox, nunca retorna a partir do construtor - parece um bug na implementação de RegExp, mas se você fornecer uma expressão válida, ele funciona

Uma opção é validar as expressões gerado pelo usuário. Isso é; escapar caracteres que você sabe que vai parar o seu script.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top