Aide REGEX

Petit nouveau ! | 3 Messages

03 avr. 2007, 22:47

Bonjour,
je développe une classe chargée de l'analyse de différents types de champs (MAIL,IP,DATE,...) contenus dans un formulaire web. Malheureusement, je rencontre quelques petites difficultés à expliquer/élaborer certains résultats/masques, pouvez-vous m'eclairer sur les points ci-dessous ?
  • PROBLEME D'ANALYSE - CHAMPS TYPE URL
    Masque: '#^(?:(?:http://|www\.)|(?:http://www\.)){1}(\w(?:-?\w)*)\.(\w{2,3})$#i'
    Résultat attendu: match URL basiques sans paramètres et ne contenant que le caractère - .
    Résultat constaté: match URL de base mais aussi celles contenant un _ : pourquoi ?
  • PROBLEME MASQUE
    Je souhaite vérifier qu'un nombre est composé de 2 ou 4 chiffres, comment ecrire ce masque ?
    J'ai bien essayé: '#\d{2}|{4}#' , '#\d(?:{2}|{4})#' , '#\d{2}|\d{4}#'. Mais rien n'y fait, je me retrouve toujours avec le même warning d'offset.
En vous remerciant d'avance,

Yvan.
Modifié en dernier par dighan le 04 avr. 2007, 18:25, modifié 1 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

04 avr. 2007, 01:29

La syntaxe c'est motif{min[,max]}.
Donc dans ton cas \d{2,4}

Petit nouveau ! | 3 Messages

04 avr. 2007, 02:16

Oui, tu as raison. Seul hic, ce masque autorise aussi les nombres sur 3 chiffres(cf post: 2 OU 4 chiffres).

As-tu une idée concernant le masque appliqué aux données du type URL ?
Pourquoi match-il avec une URL de ce type www.mon_site.com sachant que je ne mentionne jamais le caractère _ dans mon masque ?

ViPHP
ViPHP | 1380 Messages

04 avr. 2007, 08:25

Oui, tu as raison. Seul hic, ce masque autorise aussi les nombres sur 3 chiffres(cf post: 2 OU 4 chiffres).
Dans ce cas tu dois utiliser la construction des alternatives:
\d{2}|\d{4}

\d classe des numériques
| symbole pour "ou"

(Edit: en deuxième lecture, je vois que tu l'as déjà essayée, ton erreur doit donc provenire d'autre chose. Donne-nous tout ton motif))
As-tu une idée concernant le masque appliqué aux données du type URL ?
Pourquoi match-il avec une URL de ce type www.mon_site.com sachant que je ne mentionne jamais le caractère _ dans mon masque ?
Parce-que le _ fait partie de la classe \w (ainsi que, dans la plupart des cas, les accentués qui ne sont pas autorisés par les RFC). Remplace cette classe par une classique [a-z0-9]

De plus, en lisant ton motif, même corrigé, il me semble qu'il ne prendra pas des URI du style moi.et.toi.domaine.fr

Rajoute le point dans le groupe du domaine et ça devrait le faire.

PS: édite ton message et désactive les smilies.
ripat

Mammouth du PHP | 505 Messages

04 avr. 2007, 08:55

Q1
Il aurait fallut donner des exemples d'url car "ne contenant que le caractère - ." tu parles du - ou du . et la phrase suivante dit que ca matche aussi les _ donc rien a voir avec la phrase précédente...

Quoiqu'il en soit, tucompliques ta regexp pour rien

^(?:https?://|)[\w./]+$
http:// ou https:// ou rien
suivant d'un path constituer de mot, de point et de /,

Idéalement, faut rajouter les % car les urls peuvent en contenir (y a d'autre caractère a prévoir aussi suivant le context, genre les entités si l'url viens d'un source html)

Q2
Tu y étais presque, une alternative avec le caractère | doit etre entouré de parentheses.
Ici, on ne match que les chaines faites de 2 ou 4 chiffres, rien d'autre
^(\d{2}|\d{4})$

Si tu veux matcher les chaines de 2 ou 4 chiffres au milieu d'une phrase
tu completes le début et la fin par un non chiffre
(?:^|\D)(\d{2}|\d{4})(?:\D|$)

Eléphant du PHP | 170 Messages

04 avr. 2007, 09:52

Vu les formes et les caractères que peuvent contenir une url, je pense que le plus simple c'est un test basique ça :
<?php
preg_match('`https?://\S+`',....
?>
Ou alors, il faut mettre au point une règle précise de ce que l'on veut et à laquelle toutes les url passées devront se plier.

Concernant la vérif d'un nombre de 2 ou 4 chiffres, c'est possible sans regex
<?php
if(is_numeric($var) && (strlen($var)==2 || strlen($var)==4))
{

// ou

if(ctype_digit($var) && (strlen($var)==2 || strlen($var)==4))
{
?>
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends

Petit nouveau ! | 3 Messages

04 avr. 2007, 18:49

Merci pour vos réponses.

Ripat > Oui en effet, j'ai bien testé ce pattern. Celui que tu m'as donné est exactement celui que j'ai ecrit. En réalité, je n'ai pas d'erreurs mais plutôt un warning (offset, sans doute lié à la config php). Maniac, j'ai donc cru que mon masque était mal constitué: merci de m'avoir confirmé.
Pour la classe \w contenant le _, je ne le savais pas.

titerm > Pour les caractères manquants, je suis bien d'accord.

Enfin Expreg, je me suis aussi penché sur cette technique suite à mon petit souci de \d{2}|\d{4}. Sur un simple test (1 itération), j'ai constaté que les regex étaient plus rapides.

Encore une fois merci pour votre aide,

dighan