2009-10-20 8 views
0

Lorsque je teste mon javascript à ce site il se comporte comme je m'attendais.Javascript RegExp échoue toujours

Cependant quand je tente de le tester sur ma page il échoue toujours le test

function testName() { 
    if (new RegExp('^(?!^(\..+)?$)[^\x00-\x1f\\?*:^&!`[email protected]#$$+=<>\?\*;|/]+$').test("me")) { 
     alert("good"); 
    } 
    else { 
     alert("invalid characters"); 
    } return false;   
} 

L'expression est censé tester un nom de fichier pour les caractères spéciaux comme ^&*!~ + = <> `etc. Am I Il manque quelque chose de stupide?

+0

S'il vous plaît reproduire le problème sur un site public ou sur http: // jsbin.com Le code semble correct. Je suppose que c'est autre chose, en dehors de ce code, qui cause un problème. – brianpeiris

Répondre

0

Une fois que j'ai fermé mon navigateur et effacé le cache, mon expression originale a fini par fonctionner, ce qui est bien parce que, comme l'a dit Warren Young, l'expression de remplacement était moche.

if(/^[\w-.()\']+$/.test(this.form.mediaFile.value)) return true; 
else return false; 
1

Ne voulant pas analyser votre énorme RE laid, je peux voir l'un des deux problèmes:

  1. Votre test est en arrière. L'appel test() renverra false dans votre exemple ci-dessus, ce qui signifie qu'il ne correspond à aucun mauvais caractère dans "moi", donc vous recevrez une alerte disant "caractères invalides", qui est en arrière.

  2. Votre syntaxe pour le test est incorrecte. Essayez d'utiliser une expression régulière littérale à la place:

    if (/^(?!^(\..+)?$)[^\x00-\x1f\\?*:^&!`[email protected]#$$+=<>\?\*;|/]+$/.test("me")) { 
    
+0

Désolé, j'aurais dû être plus précis sur ce que j'ai fait jusqu'à présent. À l'origine, j'avais le regex littéral mais l'ai déplacé vers un RegExp afin que je puisse m'assurer que ce n'était pas une expression invalide. Aussi je pense que vous pouvez être en arrière sur le test retournant la partie fausse, étant donné cette expression. –

+0

Oui, mes alternatives sont soit-ou, pas les deux. J'aurais pu vous dire lequel si j'étais prêt à essayer de comprendre ce que signifie cette ER, mais comme je l'ai dit, je ne suis pas prêt. :) –

6

Lorsque vous mettez votre regex dans une chaîne (comme lorsque vous utilisez "nouveau RegEx()" au lieu de /.../ notation), la chaîne de regex a changer. Pourquoi? Parce qu'il va être analysé deux fois maintenant au lieu d'une fois: d'abord, sous la forme d'une chaîne - ce qui signifie que tout le traitement antislash normal qui se passe à l'intérieur des constantes de chaîne aura lieu, et deuxièmement, comme une regex.

1

En dehors de la question échappe, des assertions (votre groupe (?!) sont tout simplement broken in IE (et non étaient dans la spécification JavaScript d'origine). Ils ne devraient pas être utilisés dans le JavaScript côté client. Au lieu de cela, cassez les tests dans cette clause dans des conditions séparées.

(Si cela est un testeur de nom de fichier, vous ne devriez pas compter sur elle pour la sécurité car il y a beaucoup de constructions brisées, il ne se coince pas.)