2010-01-25 9 views
2

J'ai écrit une fonction simple pour vérifier si la chaîne que j'envoie "devrait être" valide ou non.Comment fonctionne preg_match exactement?

// this works without problems 
function validate_email ($value) { 
    return preg_match ("/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/", $value); 

} 

// this doesn't work 
function validate_string ($value) { 
    return preg_match ("([^<>?=/\]+)", $value); 

} 

la première fonction fonctionne bien, si j'envoie un e-mail à validate_email Je suis habitué à retenir valide, il me retourne 1 ou 0 sinon.


validate_string devrait faire la même chose avec des chaînes de toutes sortes, mais sans ? = < >/\. Si je vérifie la fonction il me retourne 1 dans n'importe quel cas, pourquoi?

validate_string ("tonino"); // return 1 ok 
validate_string ("ton\ino\"); // return 1 why? 
validate_string ("ton?asd=3"); // return 1 why? 

le ^ omble intérieur ([^<>?=/]+) devrait signifier pas les caractères après (ou non?)

+1

Cette vérification par courriel ne fonctionne pas sans problème. Il ne correspond pas à [email protected] pour les débutants. – Quentin

+0

oui, il valide les adresses avec une extension pas plus de 4 caractères, est .museum une extension valide? – vitto

+0

Il est, avec des noms comme ".mobi" ou ".xn - 0zwm56d": http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains –

Répondre

1

Il y a plusieurs erreurs dans votre code. En outre, "ton\ino\" n'est pas une chaîne valide et [^<>?=/\]+ n'est pas une expression régulière valide, vous avez probablement un malentendu logique.

Votre expression régulière [^<>?=/\\]+ (ici corrigé) correspondra s'il y a au moins un caractère non <, >, ?, =, / et \. Donc s'il y a au moins un tel caractère, preg_match renvoie 1. ton\ino" et ton?asd=3 contiennent tous deux au moins un tel caractère (la correspondance est dans les deux cas ton).

Un correctif est d'utiliser soit des affirmations pour le début et la fin de la chaîne (^ et $) à ne permettre à des caractères juridiques pour toute la chaîne:

^[^<>?=/\\]+$ 

Ou utiliser une classe de caractère positif [<>?=/\\]+ pour correspondre aux caractères illégaux et niez l'expression de retour preg_match:

function validate_string ($value) { 
    return !preg_match("([<>?=/\\\\]+)", $value); 
} 

Mais il serait certainement préférable d'utiliser une liste blanche au lieu d'une liste noire.

+1

Er ... Votre expression n'est pas non plus une expression régulière valide. –

+0

@ Álvaro G. Vicario: Correction. – Gumbo

+0

Je reçois toujours des problèmes avec les expressions rationnelles, merci pour l'aide, j'utilise cette expression parce qu'elle est pour les URLs comme les artistes japonais last.fm, donc je dois insérer presque tous les caractères – vitto

4

Vous ne correspondant pas au début (^) et à la fin ($) de la chaîne. Donc, "ton?asd=3" correspond car le modèle correspond à t (et le reste de la chaîne n'est pas pertinent).

+1

Je crois que pattern correspond '' ton'' dans votre exemple – SilentGhost

+0

Oui, cela correspond 'ton' (puisque l'expression est gourmande). Le 't' est tout ce qui est nécessaire pour qu'il corresponde bien (bien que je n'aie pas trop bien exprimé ça). – Quentin

+0

merci, j'essaie à chaque fois de me souvenir des règles regex, mais j'échoue toujours !! – vitto

0

\ est un méta-caractère, vous devez y échapper. Ce serait donc

return preg_match ("([^<>?=/\\\\]+)", $value); 
+1

Cette expression rationnelle est invalide et ne compilera même pas –

+0

@ Álvaro Oups - en oubliant d'échapper correctement tout en conseillant d'échapper correctement: Ironie, ton nom est ... – Amarghosh

0
function validate_string ($value) { 
    return !preg_match('#[<>?=/\\\\]#', $value); 
} 
+0

Un peu d'explication serait bien. –

+1

Ce code peut être utile ou non, mais il ne répond pas à la question. Juste montrer un petit morceau de code n'aidera pas le demandeur ou d'autres lecteurs à comprendre le problème et sa solution. – AdrianHHH