2011-08-15 11 views
0

Je suis en train d'utiliser regex pour valider l'entrée de l'utilisateur, je suis désireux de laisser une lettre de l'alphabet, les chiffres, les espaces et les symboles suivants:Regex Aide - Identifier les symboles

! £ $% & *() _ + []:; @ ~ # <>? ,. -

Je n'ai jamais été aussi bon avec regex, car il me déroute complètement. C'est le meilleur que j'ai, mais ça ne fonctionne pas correctement parce que si je mets un? sur le terrain, je reçois l'erreur.

<?php 
    $title = $_POST['title']; 

    if (!preg_match('/\/^[a-zA-Z0-9\s!£$%&*()_+[\]:;@~#<>?,.-]+$\//m', $title)) { 
     $error = "Photo name contains unsafe characters."; 
     $solution = "<a href=\"javascript:history.go(-1)\">Try again?</a>"; 
    } 

    if ($error) { echo("$error"); 
?> 

Pourquoi suis-je toujours obtenir ces choses regex mal, juste quand je pense que je commence à comprendre, je me rends compte bientôt je ne suis vraiment pas! : P

Si quelqu'un pouvait m'aider et peut-être expliquer pourquoi mon exemple ne fonctionne pas, je peux apprendre de mes erreurs qui seraient très appréciées, merci!

Répondre

1

Vous avez une / supplémentaire avant le^et après $, celui-ci devrait fonctionner:

preg_match('/^[a-zA-Z0-9\s!£$%&*()_+[\]:;@~#<>?,.-]+$/m', $title) 

également le modificateur m causerait $ pour correspondre à la fin de la ligne, et permettre à quelqu'un d'ajouter tout caractère après la première ligne, donc vous devriez l'enlever.

+0

Ah, ça marche! Je vous remercie! Donc, avec le modificateur m, je devrais l'enlever pour laisser preg_match ('/^[a-zA-Z0-9 \ s! £ $% & *() _ + [\]:; @ ~ # <>?,. -] + $/', $ title); ? Et juste pour vérifier je comprends pourquoi ... le m serait si ils écrivent dans une zone de texte et ensuite créé un nouveau paragraphe, après la première ligne, ils pourraient insérer tout ce qu'ils voulaient depuis le $ a arrêté le contrôle regex maintenant? Est-ce que cela est toujours conforme pour les champs de saisie de texte unique où une seule ligne peut être écrite, est-ce que cela peut être "piraté" pour ainsi dire faire des paragraphes/plus d'une ligne? Désolé si j'ai mal compris, j'apprends encore :) – Joe

+1

Oui pour la première question. Pour le 'm', normalement' $ 'correspond à la fin de la chaîne, donc un regex'/^ ... $/'ne correspond que si la chaîne entière est reconnue par la regex. Mais avec 'm', le' $ 'correspond à la fin des lignes, donc un regex'/^ ... $/m' correspond si une seule ligne dans la chaîne entière est comparée par l'expression régulière. – arnaud576875

+0

Donc, pour la majorité des choses telles que la vérification d'un prénom d'utilisateur ou dans ce cas, un titre à une photo téléchargée, alors un m n'est pas nécessaire que vous vérifiez simplement la chaîne? Et ceci est déjà identifié avec le/^ $/ – Joe