IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Créer une fonction de recherche multi début de mot


Sujet :

JavaScript

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Par défaut
    cerede2000,

    C'est sur et certain ce que tu me dis la

    Mais ma figure de style doit se faire en Javascript lol.

  2. #22
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Hum a la limite ce que tu pourrais faire meme si ca va etre super long a mettre en place c'est deja separé tes communes par lettres...
    A
    B
    C
    ...
    Et donc une variable pour chaque lettre, et donc quand tu cherche une commune, tu regarde sa premiere lettre et comme ca tu determine quel variable utilisé :S

  3. #23
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Ok c'est ce que je craignais lol, tu peux tenter ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    reg1 = new RegExp("[ ]+", "g");
    reg3 = new RegExp(";", "g");
     
    function completionLibelleCommune(valeur) {
    	result ="";
    	buffer = "";
    	valeur = valeur.toUpperCase();
     
    	// Création du tableau des mots-clés
    	keywords = valeur.split(reg1);
    	// Création du motif
    	pattern = "^" + keywords[0];
    	for(i = 1; i < keywords.length; i++)	{
    		pattern += ".*" + keywords[1];
    	}
    	pattern += ".*$";
    	reg2 = new RegExp(pattern, "gi");
     
    	for(i = 0, char = null; i < listeCommunes.length; i++)	{
    		char = listeCommunes[i];
    		if(char == "|")	{
    			datas = buffer.split(reg3);
    			if(reg2.test(datas[1]))	{
    				result += datas[1] + " (" + datas[0] + ")<br/>";
    			}
    			buffer = "";
    		}
    		else	{
    			buffer += char;
    		}
    	}
    	return result;
    }

    En fait il faudrait réduire la liste au fur et à mesure mais de toute façon la chaîne de départ est un peu grande. Si tu dois absolument rester en JS, la soluce de cerede2000 me semble pas mal ^^. Tu peux aussi utiliser un arbre.

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Par défaut
    Djackisback,

    La dernière implémentation plante carrément le navigateur (IE)

    Je pense que le plus simple est de faire une regexp de chaine sur la variable. Car en tableau c'est pas possible de tenir la charge. La variable est une longue chaine composés de la manière suivante |code postal;nom-de-commune|
    Le but étant de faire une recherche sur la chaine plutôt qu'un tableau.


    J'essai d'optimiser de la manière suivante : \d{5};[a-zA-Z-]+| il trouve bien les codes postaux et déchiffre les noms des communes.
    En faite le souci que j'ai maintenant c'est que je ne sais pas comment faire pour remplacer [a-zA-Z-] par deux chaines en dure.
    Style \d{5};[chaine commençant par xxx, suivi par la chaine commencant par yyyy]|

    Quelqu'un aurait une idée sans passer par des tableaux et en faisant une regexp du style : je cherche les codes postaux, puis je cherche les communes contenant les chaines que j'ai saisie dans mon champ ?

    Merci

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Par défaut
    personne ?

  6. #26
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Ce sera encore pire si tu lances une regex sur ta chaîne de 1Mo. Si tu veux tenter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	// Création du motif
    	pattern = "([0-9]+)(;)" + "(" + keywords[0];
    	for(i = 1; i < keywords.length; i++)	{
    		pattern += "[-A-Z ]+" + keywords[1];
    	}
    	pattern += "[-A-Z ]+)";
    Comme dit précédemment le stockage dans un tableau associatif par lettre ou suite de lettre, ou l'utilisation d'un arbre me semble le plus adapté.

  7. #27
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Et oui

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Par défaut
    J'ai du rater quelque chose...

    ca ne retourne aucun résultat, ni même aucune erreur.
    Comment mets tu en place ton code dans ma fonction ?

    J'en terminerai avec ce sujet sur ce point.

    Merci

  9. #29
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <script>
    reg1 = new RegExp("[ ]+", "g");
     
    function completionLibelleCommune(valeur) {
    	result ="";
    	div = document.getElementById("donnees");
     
    	// Création du tableau des mots-clés
    	keywords = valeur.split(reg1);
    	// Création du motif
    	pattern = "([0-9]+)(;)" + "(" + keywords[0];
    	for(i = 1; i < keywords.length; i++)	{
    		pattern += "[-A-Z ]+" + keywords[1];
    	}
    	pattern += "[-A-Z ]+)";
     
    	reg2 = new RegExp(pattern, "gi");
    	matches = listeCommunes.match(reg2);
     
    	div.innerHTML = "";
    	for(i = 0; i < matches.length; i++)	{
    		div.innerHTML += matches[i] + "<br/>";
    	}
    }
    </script>
     
    <input type="text"
    class="texte"
    id="completion_text"
    name="completion_text"
    onKeyUp="completionLibelleCommune(this.value);">
     
    <div id="donnees">
    	</div>
    La fonction intermédiaire creerDiv(tab) est pas une bonne idée car tu repasses la copie du valeur de grande taille.

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Par défaut
    Merci,

    ça marche mieux en terme de temps de consommation CPU à 100%.

    Par contre en parallèle on a cherché avec la méthode match qui donne des résultats formidable en plus de notre ancienne méthode de recherche par string et index.

    Encore merci à vous tous pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/10/2007, 17h50
  2. Créer une Fonction recherche sur Access
    Par remwideco dans le forum Access
    Réponses: 4
    Dernier message: 30/01/2006, 10h36
  3. créer une fonction avec parametre optionnel
    Par maximenet dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2006, 20h51
  4. Réponses: 6
    Dernier message: 10/08/2005, 11h36
  5. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo