REGEXP

Résolu/Fermé
Heryu Messages postés 567 Date d'inscription mercredi 15 juillet 2009 Statut Membre Dernière intervention 28 juin 2016 - Modifié par Heryu le 26/10/2015 à 17:30
Heryu Messages postés 567 Date d'inscription mercredi 15 juillet 2009 Statut Membre Dernière intervention 28 juin 2016 - 27 oct. 2015 à 14:50
Bonjour,


Je souhaiterais récupérer l'élément en gras à l'aide à l'aide des opérateurs relationnels :

<dgam>2</dgam>
<daut>1</daut>
<dlang>Anglais</dlang>
<dannee>1985</dannee>
<dcomp></dcomp>
<dnbj>1;3</dnbj>
<dduree>15;par joueur</dduree>
<dthe>11</dthe>
<dmeca>8;12;</dmeca>
<dage>3</dage>
<dedit>2</dedit>
<dtags>2</dtags>
<dstaff></dstaff>
<dyoutube></dyoutube>

Tout ce que j'ai pu récupérer pour le moment, c'est le contenu des 2 balises <dnbj> avec cette requête : <dnbj>(.*?)<\/dnbj>

Avez-vous une idée de comment récupérer cet élément ?

Merci d'avance =)

2 réponses

Utilisateur anonyme
26 oct. 2015 à 21:12
voilà /<dnbj>(\d);\d<\/dnbj>/, ton code captait tout ce qui se trouvait entre les balises <dnbj>, mais alors il te fallait préciser un tout petit peu. Ce truc fonctionnera en considérant que tu cibles un seul chiffre de 1 à 9, suivi d'un ; et d'un seul autre chiffre quelconque.
0
Heryu Messages postés 567 Date d'inscription mercredi 15 juillet 2009 Statut Membre Dernière intervention 28 juin 2016 62
27 oct. 2015 à 09:28
Merci de ta réponse Sunr,

J'ai oublié de précisé que c'est pour une requête SQL et qu'il me semble que je ne peux pas récupérer de groupes.

J'ai testé ton code sur ce site : https://regexr.com/ et ça me récupère quand même, le contenu des 2 balises.
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 27/10/2015 à 10:57
non, la regexp de Sunr capture bien le chiffre seul "1" avec les parenthèses.

le site que tu indiques ne montre que la ligne qui matche la regexp, pas la partie de la regexp capturée par les parenthèses.

avec Php, cela se récupère dans un tableau passé en 3ème argument https://www.php.net/preg_match ("Si matches est fourni, il sera rempli par les résultats de la recherche. $matches[0] contiendra le texte qui satisfait le masque complet, $matches[1] contiendra le texte qui satisfait la première parenthèse capturante, etc.").

Sinon, pour rendre la regexp plus flexible et matcher les chiffres qui suivent la balise ouvrante qu'il y en ait un ou plusieurs (donc un nombre entier quelconque), s'arrêter au ; s'il y en a un, matcher aussi s'il y a des chiffres après, mais ne pas échouer s'il n'y a rien après le ; et avant la balise fermante, tu peux utiliser une regexp plus flexible de ce type :

/<dnbj>(\d+);*\d*<\/dnbj>/


Dal
0
Heryu Messages postés 567 Date d'inscription mercredi 15 juillet 2009 Statut Membre Dernière intervention 28 juin 2016 62
Modifié par Heryu le 27/10/2015 à 14:01
Merci de ta réponse [Dal],

Ta requête passe en effet les bon paramètres en PHP, mais en SQL, c'est une autre paire de manches ^^

J'ai tenté cette requête :
SELECT * FROM `table` WHERE column REGEXP('<dnbj>(\d+);*\d*</dnbj>') > 0

Et ça ne me ressort rien. Est-ce qu'au final, ce type de requête est impossible en SQL ?
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 27/10/2015 à 14:26
Ah désolé, je n'avais pas compris que c'était une requête SQL comme tu postais dans le forum Php.

Le support dépend du SGMB utilisé, j'imagine, mais une requête SELECT devrait de toutes façons renvoyer une ligne (avec *, ou un champ si tu en en précises un) et non pas une partie d'un champ.

A ta place, je ferai en deux temps :

SELECT * FROM table WHERE colum LIKE '<dnbj>%';


et j'appliquerai preg_match sur le résultat pour capturer les données qui t'intéressent.


Dal
0
Heryu Messages postés 567 Date d'inscription mercredi 15 juillet 2009 Statut Membre Dernière intervention 28 juin 2016 62
Modifié par Heryu le 27/10/2015 à 14:52
Ah mince j'avais pas fait gaffe au forum =s

Je pense que je vais mettre les informations dans des colonnes à part en BDD car il y a un count sur la même requête, et je ne peux pas dissocier ça en PHP, il faut que l'ensemble du script tienne sur une seule requête SQL ^^

En tout cas, merci de ton aide =)
0