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

WRInaute occasionnel
Bonjour, je suis confronté à un léger problème , je vais vous l'expliquer dans son contexte, de façon à faire un sujet qui correspond à un exemple concret.
Soit : une liste contenant des dizaines de milliers de parties d'échecs dans le format PGN , un format très classique dans le domaine. (PGN signifie portable notation game (voir wikipedia pour les curieux)).
rappel : les coups de la partie, au format PGN , se présentent toujours de la façon suivante:

1.[espace][LE COUP DES BLANCS][espace][LE COUP DES NOIRS][espace]2.[LE COUP DES BLANCS][espace][LE COUP DES NOIRS][espace]3. etc jusqu'à la fin de la partie...
Donc littéralement : c'est toujours un nombre, suivi d'un point, suivi d'un espace, suivi du coup des blancs, suivi d'un espace, suivi du coup des noirs, suivi d'un espace, suivi du nombre suivant...etc

Et je cherche à définir une règle permettant de trouver toutes les entrées de ma base de données MySQL ne comportant qu'un nombre défini de coup.

Pour un coup : j'aimerai qu'elle retourne toutes les chaines se finissant par 2. (sans le 2.)
Pour deux coups : Toutes les chaines se finissant par 3.(sans le 3.)

Mais je n'y arrive pas, je parcours le site du zéro en boucle pour apprendre et réapprendre tout ce qu'il à a partager sur les expressions régulières, mais en vain... j'arrive à définir un coup, mais pas 2 coups, 3 coups, n coups...

Merci de me mettre sur une piste, si vous le pouvez, cordialement
Mike.
 
WRInaute accro
Par exemple:

/^ 2\. [^ ]+( [^ ]+)?$/

Note que ça se base sur le format que tu donnes (i.e. un coup blanc, un coup noir, sans commentaires et autres constructions PGN). J'ai quand même prévu le cas où les blancs gagnent (il qu'il n'y a donc pas de coup final des noirs).

Perso, je serais à ta place, je découperais toutes les parties et je ferais une ligne par coup en base, c'est plus facile à manipuler ensuite.

Jacques.
 
WRInaute occasionnel
un ami m'a proposé la solution suivante, carrément dans la requête SQL :

Code:
$notmove = 2; // 3 4 5 , comme on veut...


SELECT *
FROM `liste_pgn`
WHERE `PGN` NOT LIKE \"%$notmove%.\"

donc je pense que cela m'épargne l'expression régulière, je vais essayer cette solution et vous tenir au courant, merci Jacques de prendre la peine d'étudier mon problème, cordialement. Mike.
 
WRInaute impliqué
Ca va buguer quand tu auras un 2 dans la liste des coups, Fe2 par exemple. Ca fonctionnera mieux en rajoutant le point comme dans l'exemple de jcaron.

Tu peux utiliser les regex dans ta requête sinon: http://dev.mysql.com/doc/refman/5.0/fr/regexp.html

Ceci dit si tu fais des stats sur les ouvertures il sera beaucoup beaucoup plus rapide de passer par le PHP et stocker les résultats que de passer mySqL pour chaque page.

Je procéderais comme suit:
1) Récupération de toutes les parties depuis la bdd

2) Boucle sur les résultats

3) Mise en tableau de la forme:
$my_array[$numero_demi_coup]['ouverture'] = la chaine de déplacement (e4c5Cf3Cc6d4 par exemple)
$my_array[$numero_demi_coup]['ouverture']['compte'] = une donnée à increment représentant le nombre de fois où $my_array[$numero_demi_coup]['ouverture'] est trouvé.

4) Insertion dans une autre table:
Open_id => ID de l'enregistrement
Open_string => $my_array[$numero_demi_coup]['ouverture']
Open_num => $my_array[$numero_demi_coup]['ouverture']['compte']

5) Traitement des résultats:
Tu cherches les stats de toutes les Siciliennes par exemple:
$sql = "SELECT Open_num FROM matable WHERE Open_string = 'e4c5'";
 
Discussions similaires
Haut