Problème pour définir une expression régulière.

WRInaute occasionnel
Bonjour, et merci d'essayer de m'aider...

Mon problème est le suivant, je dois définir une règle pour déterminer si $variable est de la forme

Code:
"1. TEXTEALEATOIRE 2. TEXTEALEATOIRE 3. TEXTEALEATOIRE 4. TEXTEALEATOIRE 5. TEXTEALEATOIRE 6. TEXTEALEATOIRE 7. TEXTEALEATOIRE 9. TEXTEALEATOIRE 10. TEXTEALEATOIRE 11. TEXTEALEATOIRE 12. TEXTEALEATOIRE"

l'application pratique est de déterminier si un fichier PGN (portable notation game) d'une partie d'échecs est de la bonne syntaxe.
TEXTEALEATOIRE contient les coups de la partie. Sachant que TEXTEALEATOIRE n'est pas susceptible de contenir lui même
1. 2. 3. ou un autre nombre suivi d'un point.

Merci de me donner un petit coup de pouce si vous le pouvez...
 
WRInaute accro
Si ce sont des coups d'une partie d'échecs, il n'est probablement pas si aléatoire que ça, si? Et évidemment le nombre de coups peut varier. Tu veux juste valider rapidement, ou tu veux interpréter?

Plusieurs options:
/^1\. .*(? 2\. .*(? 3\. .*(? 4\. .*)?)?)?$/ (je te laisse développer sur le nombre de coups max)
/^(?:(\d+)\. .*? )*$/ et tu vérifies ce que preg_match te renvoie
utiliser un preg_split avec / (\d+)\. / (mais ça ne vérifie pas que les numéros sont consécutifs)

Il y en a probablement encore plein d'autres. En tenant compte de la syntaxe complète PGN il doit être possible de valider plus. Note que:
- la syntaxe PGN semble indiquer qu'il est possible d'avoir plusieurs points après le numéro, je n'ai pas intégré ça ci-dessus
- je considère qu'il y a exactement le nombre d'espaces qu'il faut où il faut. Tu as probablement intérêt à utiliser \s+ au lieu d'un espace pour être plus "souple"

Bref, quoi qu'il arrive, à tester sur beaucoup d'exemples réels :)

Jacques.
 
WRInaute occasionnel
Merci pour ta réponse, je vais l'étudier, je tiens à te préciser que TEXTEALEATOIRE doit être ignoré, il correspond à un coup qui à la bonne syntaxe de manière sûre, la seule utilité est de vérifier si il y a bien dans cet ordre
un numéro, un coup blanc, un coup noir, un changement de numéro (le bon numéro 1 2 3 4 dans l'ordre)

TEXTEALEATOIRE peut seulement contenir R N B Q K , suivi de a b c d e f g h suivi de 1 2 3 4 5 6 7 8 suivi de "x" suivi de a b c d e f g h suivi de 1 2 3 4 5 6 7 8 suivi de espace suivi de R N B Q K , suivi de a b c d e f g h suivi de 1 2 3 4 5 6 7 8 suivi de x suivi de a b c d e f g h suivi de 1 2 3 4 5 6 7 8 suivi de espace.

mais là n'est pas le problème puisque sa syntaxe est bonne mais pas forcément le nombre qui précède le coup.

c'est pour vérifier l'ordre que je cherche une règle.

Car si l'ordre de coup est correct, j'ai obtenu un parser qui fonctionne selon cette règle :

Code:
/\s*\[\s*\w+\s*"[^"]*"\s*\]\s*[^\s\[\]]+[\s\S]*\[\s*\w+\s*"[^"]*"\s*\]\s*/m;

j'étudie actuellement ta solution , cordialement , mike.
 
WRInaute accro
Bonjour

Sinon, en mode Posix :

"^[([ \t]*[0-9]+[ \t]*[\.][^0-9]+)]+[ \t]*$"

devrait faire l'affaire ?

0 ou + espace ou tabulation, suivi d'un nombre, suivi de 0 ou + espace ou tabulation, suivi de un point, suivi de un ou plus de caractères ( caractères étant tout sauf un nombre ), le tout répété au moins une fois, et entre début et fin ( ^ et $ )

Si le nombre est toujours avant le point, ça devrait marcher.

Moi, je ne connais que Posix, pas les expressions pcre... ;(

Mais... Cette expression marche aussi en pcre. ;)

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute occasionnel
J'ai essayé, cela ne conviens pas tout à fait, mais je vais travailler dans ce sens, merci d'avoir donné une direction à mon travail , car l'enjeu est de taille, j'ai 17000 ouvertures d'échecs en toutes les langues, donc le site va être énorme...et l'expression régulière dois être à sa hauteur... ;) Merci du coup de pouce je vais m'y atteler... cordialement

Mike.
 
Discussions similaires
Haut