IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Interdire le backslash dans ma RegExp [RegExp]


Sujet :

JavaScript

  1. #1
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut Interdire le backslash dans ma RegExp
    Bonjour,

    j'ai un petit souci que je ne parviens pas à solutionner, j'ai créé une regex pour matcher une URL, la voilà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      var str = "http://ww.mon-sit\e.dqsf.com"; 
      var res = str.match(/^https?:\/\/([a-z0-9-.]+)\.([a-z]+)$/)?"oui":"non";
      console.log(res);//oui
    Est ce que vous pouvez m'aider s'il vous plaît ?

  2. #2
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 453
    Points : 4 602
    Points
    4 602
    Par défaut
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    var res = str.match(/[^\\]/)?"oui":"non";
    ?
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  3. #3
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut
    Merci, ajouté à ma regex, ça donnerais quoi ?

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Ben Doksuri t'a donné la regexp qui va bien là...

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 861
    Points : 6 563
    Points
    6 563
    Par défaut
    En fait tu n'as rien à faire du tout, car effectivement ta pattern n'autorise pas l'antislash.

    Là où tu te fourvoie, c'est que ta chaîne de test n'en contient pas! (Ce que tu peux vérifier en l'affichant).

    Comme l'antislash est utilisé pour les séquences d'échappement dans les chaînes de caractères (par exemple \n pour le saut de ligne), pour le faire figurer dans une chaîne tu dois le doubler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var str = "http://ww.mon-sit\\e.dqsf.com";
    Car en écrivant juste var str = "http://ww.mon-sit\e.dqsf.com";, comme la séquence \e n'existe pas, l'antislash est tout bonnement ignoré.

    Un simple test pour t'en convaincre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log( "mon-sit\e" === "mon-site" ); // true
    NB: Si c'est pour aboutir à un booléen, à mon avis la méthode RegExp.prototype.test() est plus appropriée que String.prototype.match().
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut
    Trop bien, merci beaucoup, je me demandais pourquoi rajouter encore une condition alors que je ne l'autorisais pas...

    C'est le fait de tester si ma regex fonctionnait comme ça qui ma fait buguer (si envoyé via un champ, je pense que ça reconnaitra le \)... j'avais regardé à mettre deux antislash dans l'URL mais je me posais des questions.

    merci d'y avoir répondu et de solutionner mon problème!

    Merci pour RegExp.test(), plus rapide je suppose

  7. #7
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut
    J'en profite pour vous demander comment ont fait, dans une regex, quand veut des caractères et d'autres pas ?

    je connais [a-z0-9...] pour accepter et [^a-z0-9...] pour interdire mais les deux ensembles, je sais pas

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 861
    Points : 6 563
    Points
    6 563
    Par défaut
    C'est simple, il faut trouver la manière la plus pratique pour exprimer sa classe de caractères en jouant avec ce qu'il est possible de faire (et que tu as déjà en partie sous les yeux).
    Certains langages disposent de la possibilité de faire des opérations à l'intérieur des classes de caractères (des soustractions ou des intersections), mais ce n'est pas le cas de Javascript.
    De toute manière cette possibilité peut être considérée comme un simple sucre syntaxique dont il est relativement simple de se passer la plupart du temps en utilisant les moyens déjà à disposition:
    • les rangs [s-y] <=> [stuvwxy]
    • la négation [^s-y] <=> tout caractère qui n'est ni un s, ni un t ... ni un y.
    • les classes prédéfinies classiques, avec pour chacune, leur contraire: \s et \S, \w et \W, \d et \D.
    • pour les navigateurs récents et nodejs, les propriétés unicode: \p{L}, \p{N}, \p{Z}, \p{P}, \p{S} ... et leurs contraires \P{L} ...


    Exemples typiques:
    • toutes les lettres majuscules de la plage ASCII sauf le H: [A-GI-Z]
    • tous les caractères non-blancs de la plage ASCII: [!-~]
    • la classe \w (soit [a-zA-Z0-9_]) mais sans le caractère souligné _: [^\W_]
    • toujours la classe \w mais cette fois-ci sans les chiffres: [^\W\d] ou [^\W0-9] ou plus simplement [a-zA-Z_]
    • les symboles monétaires \p{Sc}
    • les symboles monétaires sauf le dollar [^\P{Sc}$]
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut
    Merci donc pour interdire par exemple, une phrase qui contient que des lettres et des espaces mais qu'on interdit le mot "insulte" par exemple, je peux faire comme suit ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log(RegExp(/^([a-z]+\s?).*[^insulte]$/i).test("Mon insulte"));//false...
    je comprends pas comment faire

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 861
    Points : 6 563
    Points
    6 563
    Par défaut
    Non.

    Une classe de caractères représente un caractère parmi un ensemble de caractères (il n'y a pas d'ordre particulier). Si tu ne maîtrise pas ça, direction tutoriel sur les regex.

    [^insulte] signifie: un caractère qui ne soit ni un i, ni un n, ni un s, ni un u, ni un l, ni un t, ni un e.

    En plus, .* autorise absolument n'importe quoi.

    La syntaxe RegExp(/.../i) bien que valide n'est pas utile. Soit on a la nécessité d'utiliser le constructeur de manière explicite avec une chaîne pour par exemple introduire la valeur d'une variable dans l'expression, soit on ne l'a pas et dans ce cas utiliser la notation littérale est suffisant: /.../i.

    Pour faire échouer une pattern avec une chaîne contenant un mot particulier, disons ZOB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log(/^(?!.*ZOB).*$/.test('Écoutez la voix du vent ZOB dans la nuit')); // false
    Il faut utiliser un test avant négatif (?!...) ancré au début de la chaîne (donc juste après ^). Ce type de test va vérifier toute la chaîne, mais comme c'est juste un test, il ne consomme pas de caractères, ce qui fait qu'après lui, le reste de la pattern s'applique à la position d'où il est parti (le début de la chaîne ici). Là encore => tutoriel.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  11. #11
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168
    Par défaut
    Merci pour toutes ces infos et pour votre temps!

    ->Je Go tuto

  12. #12
    Membre habitué Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Points : 168
    Points
    168

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/08/2006, 03h36
  2. Interdire un espace dans une TextBox
    Par Ribéry dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 08/06/2006, 18h00
  3. incidence du backslashe dans une chaine
    Par rogerio dans le forum C++
    Réponses: 7
    Dernier message: 01/06/2006, 09h57
  4. fonction pour interdire un caractere dans un champ en php
    Par carmen256 dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2006, 22h41
  5. Interdire l'écriture dans un input type="file"
    Par jgfa9 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 28/11/2005, 22h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo