Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/01/2007, 16h22   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 9
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : janvier 2007
Messages : 9
Points : 1
Points : 1
Par défaut Recherche avancée dans une base

Bonjour à toutes et tous,

Je dispose d'une table (mysql) dans laquelle j'ai des noms complexes, qui commencent soit par des lettres (OK pas de soucis) soit par des chiffres (la les ennuis commence pour moi )

Je voudrais faire en sorte de proposer à mes visiteurs une fonction de recherche par première lettre du nom, par exemple tout ce qui commence par C mais là je voudrais qu'il me sortent les noms commencant effectivement par C (ça c'est Ok, le Chlorobenzene par exemple), mais en même temps les noms ou la première lettre existante sera C, le 1-3Chlorobenzene ...

Avez vous une idée, un regex peut'il m'aider ?

Merci d'avance.

Renaud
renator67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2007, 16h33   #2
Membre chevronné
 
Avatar de J0r_x
 
Homme
Analyste - Programmeur
Inscription : mai 2006
Messages : 712
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Analyste - Programmeur
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2006
Messages : 712
Points : 607
Points : 607
SELECT * FROM table WHERE nom LIKE %Lettre%
J0r_x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2007, 16h54   #3
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
Citation:
Envoyé par J0r_x
SELECT * FROM table WHERE nom LIKE %Lettre%
ben non pas ça car la il va cherche tous ce qui contient la lettre.

le mieux c'est un regex en tenant compte des chiffres et tiret, puis tu recuperes ce qui reste donc ton nom filtré
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2007, 16h58   #4
Invité de passage
 
Inscription : janvier 2007
Messages : 9
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : janvier 2007
Messages : 9
Points : 1
Points : 1
Merci pour cette réponse, mais ça ne corerespondant tout à fait à ce que je cherche a faire ...

exemple 3 noms de molécules
(je passe les notations indice et exposant de la chimie enregistrés en code HTML dans la base) :

2,4,5,6-[U-13C4]-1,3-[U-15N2]-2,5-[2H2]Dicholoropyrimidine
Chlorobenzene-13C6
4-Aminophenol-d7

La première doit pouvoir répondre sur la lettre D
La deuxième sur C
La troisième sur A

Le tout et d'arriver à faire ça dans une seule requete ...

Des idées

Renaud
renator67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2007, 17h00   #5
Invité de passage
 
Inscription : janvier 2007
Messages : 9
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : janvier 2007
Messages : 9
Points : 1
Points : 1
Citation:
Envoyé par rbaatouc
ben non pas ça car la il va cherche tous ce qui contient la lettre.

le mieux c'est un regex en tenant compte des chiffres et tiret, puis tu recuperes ce qui reste donc ton nom filtré
Je vais essayer de m'y mettre, merci en tous cas rbaatouc
renator67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2007, 17h06   #6
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
ah ok l'exemple est plus parlant.
les lettres sont tjs entre crochet?

si c'ets le cas les regex marche quand meme
si c'est pas le cas bon courage
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2007, 22h52   #7
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Elle est bien velue celle-là ! J'utilise l'hypothèse des crochets suggérée par rbaatouc.

Déjà, il faut savoir qu'un crochet gauche s'écrit [[.left-square-bracket.]] et un crochet droit [[.right-square-bracket.]]. On peut aussi utiliser [[.[.]] et [[.].]], mais je défie quiconque d'être capable de lire un truc comme ça !

Je prends ton premier exemple qui est le plus complet : avant le D, il peut y avoir deux sortes d'éléments :
- soit un caractère qui n'est pas une lettre, donc [^A-Z]
- soit une séquence composée d'un crochet gauche, une série de caractères différents du crochet droit, puis un crochet droit:
[[.left-square-bracket.]][^[.right-square-bracket.]]+[[.right-square-bracket.]]

Il peut y avoir un nombre quelconque ou nul de ces éléments, suivis ensuite du D : ^(elem1|elem2)*D

Au total, cela nous fait donc :
SELECT Nom
FROM table
WHERE Nom REGEXP '^([^A-Z]|[[.left-square-bracket.]][^[.right-square-bracket.]]+[[.right-square-bracket.]])*D' ;

PS : j'évite volontairement les balises CODE afin que ma regex tienne sur une ligne
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 09h26   #8
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
Citation:
Envoyé par Antoun
Elle est bien velue celle-là ! J'utilise l'hypothèse des crochets suggérée par rbaatouc.
juste par curiosité ça veut dire quoi "elle est bien velue?"
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 09h41   #9
Membre actif
 
Inscription : août 2002
Messages : 194
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 194
Points : 194
Points : 194
Envoyer un message via MSN à Léortien
ne me criez pas, je suis très simple d'esprit

mais il ne serait pas plus simple de rajouter un champ lettre (ou recherche) qui contient la lettre sur laquelle la recherche peut porter?

les recherches seraient très rapides.
lors de l'ajout d'un enregistrement ça fait juste une lettre à tapper en plus.

et pour éviter de se pallucher la mise à jour des enregistrements déjà existant
utiliser le regexp qu'a créé antoun dans un update pour mettre à jour le nouveau champ dans les enregistrements existants



je sais je suis naif, mais des fois ça marche...
Léortien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 10h06   #10
Invité de passage
 
Inscription : janvier 2007
Messages : 9
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : janvier 2007
Messages : 9
Points : 1
Points : 1
Merci de cette proposition mais le nom de mes molécules varie énormément je peut en avoir partout de ces numériques ainsi que crochet tirets et Cie ...

Je rigole à voir le message de Léortien, j'ai décidé ce matin de corriger mes bases pour prendre en compte une lettre d'interclassement définie au moment de l'enregistrement de la molécule ...

C'est vrai que pourquoi se compliquer la vie et en plus ça permet à nos chimistes de décider ou l'interclassement doit avoir lieu (exemple dichloropyrimidine, classé à P pyrimidine et non à D Dichloro...

Merci de votre aide en tous cas ...

renaud
renator67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 10h12   #11
Membre Expert
 
Avatar de Doksuri
 
Tiger Scott
Développeur Web
Inscription : juin 2006
Messages : 1 251
Détails du profil
Informations personnelles :
Nom : Tiger Scott
Âge : 42

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juin 2006
Messages : 1 251
Points : 1 514
Points : 1 514
salut,
je suis peu etre a l'ouest mais il me semblerais plus simple si tu faisait une table ou ya tout tes "truck" ou tu veux faire ta recherche par lettre ou par chiffre;
et une autre table "molécule" ou tu met la composition de chaque molécule en fonction de ta table "truck"

les "truck" c'est parce que la maintenant tout de suite je me souviens plus de comment ca s'appel ^^ (dsl)
Doksuri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 10h31   #12
Membre expérimenté
 
Inscription : avril 2006
Messages : 462
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Canada

Informations forums :
Inscription : avril 2006
Messages : 462
Points : 556
Points : 556
Envoyer un message via MSN à rbaatouc Envoyer un message via Skype™ à rbaatouc
Citation:
Envoyé par Léortien
ne me criez pas, je suis très simple d'esprit

mais il ne serait pas plus simple de rajouter un champ lettre (ou recherche) qui contient la lettre sur laquelle la recherche peut porter?

les recherches seraient très rapides.
lors de l'ajout d'un enregistrement ça fait juste une lettre à tapper en plus.

et pour éviter de se pallucher la mise à jour des enregistrements déjà existant
utiliser le regexp qu'a créé antoun dans un update pour mettre à jour le nouveau champ dans les enregistrements existants



je sais je suis naif, mais des fois ça marche...

sans etre méchant ça me rappele une citation de marcel pagnol :
"Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait."
rbaatouc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 11h29   #13
Invité de passage
 
Inscription : janvier 2007
Messages : 9
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : janvier 2007
Messages : 9
Points : 1
Points : 1
Citation:
Envoyé par DEMMOTTE
salut,
je suis peu etre a l'ouest mais il me semblerais plus simple si tu faisait une table ou ya tout tes "truck" ou tu veux faire ta recherche par lettre ou par chiffre;
et une autre table "molécule" ou tu met la composition de chaque molécule en fonction de ta table "truck"

les "truck" c'est parce que la maintenant tout de suite je me souviens plus de comment ca s'appel ^^ (dsl)
oui je vois ce que tu veux dire en faisaint une relation entre les 2 tables 1à1 pourquoi pas, mais là c'est bon j'ai commencé en utilsant la solution d'un champ supllémentaire reprenant une lettre pour l'interclassement ...

Merci tout de même
renator67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 11h30   #14
Invité de passage
 
Inscription : janvier 2007
Messages : 9
Détails du profil
Informations personnelles :
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : janvier 2007
Messages : 9
Points : 1
Points : 1
Citation:
Envoyé par rbaatouc
sans etre méchant ça me rappele une citation de marcel pagnol :
"Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait."
exactement
renator67 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 23h23   #15
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Citation:
Envoyé par rbaatouc
juste par curiosité ça veut dire quoi "elle est bien velue?"
euh... "cette expression régulière n'a pas été simple à mettre au point " ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h22.


 
 
 
 
Partenaires

Hébergement Web