[JS] String compare met behulp van een wildcard?

Pagina: 1
Acties:

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Ik ben momenteel aan het trachten een soortement van wildcard search te implementeren met behulp van Javascript.

Ik heb het volgende:

HTML Search Formulier:
HTML:
1
2
3
4
  <form method="post" name="frmZoeken" onsubmit="SubmitSearch();return false;">
   <input type="text" size="50" name="SearchedFor" />
   <input type="submit" name="zoeken" value="zoeken" />
  </form>

en nu wil ik middel Javascript zoeken in een Object array waar het volgende in staat:

Javascript Array:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var ff_namen = new Array;

function naam( nm, tv, vn, rn, dat, lnk ) {
  this.nm = nm;                         // achternaam
  this.tv = tv === "" ? "" : tv + " ";  // Initialen
  this.vn = vn;                         // voornamen
  this.dn = rn;                         // roepnaam
  this.lk = lnk;                        // link
}

ff_namen[ff_namen.length] = new naam( "Puk", "", "Pieter Klaas", "Pietje", "01/01/1970", "persoon_aa.html" ); 
ff_namen[ff_namen.length] = new naam( "Balkenende", "", "Jan Peter", "Petertje", "01/01/1960", "persoon_bb.html" ); 
ff_namen[ff_namen.length] = new naam( "Bos", "", "Wouter Jan", "Wouter", "01/01/1970", "persoon_cc.html" ); 
ff_namen[ff_namen.length] = new naam( "Halsema", "", "Femke Wouters", "Femke", "01/01/1973", "persoon_dd.html" ); 
ff_namen[ff_namen.length] = new naam( "Herben", "", "Mat Femkes", "Mat", "01/01/1962", "persoon_ee.html" ); 
ff_namen[ff_namen.length] = new naam( "Linden", "van der", "Heitske Mats", "Heitske", "01/01/1980", "persoon_ff.html" );

als er dan door de mensen op zoek wordt geklikt wordt er het volgende script aangeroepen:

Javascript search function:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function SubmitSearch() {
   var intperson;
   var arrtemp   = new Array();
   var strsearch = document.frmZoeken.SearchedFor.value;
   
   for (intperson=0; intperson <ff_namen.length; intperson++) {
       if (ff_namen[intperson].nm == strsearch) {
        arrtemp[arrtemp.length] = ff_namen[intperson];
       }
   }
   
   // Nu wat gaan doen met de 'arrtemp'
   // maar dat is het probleem niet....
}


Ja, wat wil ik nou toch allemaal met bovenstaande code :) .... Nou, dat is het volgende. Ik wil graag een Wildcard optie inbouwen d.m.v. * (asterix) zodat mensen die zoeken op: balk* ook gewoon 'Balkenende' als resultaat krijgen....

Heeft iemand van jullie tips hoe ik dit het beste kan implementeren?

  • André
  • Registratie: Maart 2002
  • Laatst online: 14:15

André

Analytics dude

if ((ff_namen[intperson].nm).indexOf(strsearch) > -1) { alert ("Gevonden"); }

Of je gaat met Regular Expressions werken...

[ Voor 45% gewijzigd door André op 22-01-2003 11:28 ]


  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Yogho :: Daar had ik nog niet aan gedacht! Dat is opzich wel een goede oplossing en die ga ik zeker implementeren...

Maar, weet jij wellicht hoe ik het volgende kan doen. Stel ik heb mensen met de naam: bootsma en boodsma in mijn array zitten en nu wil ik mensen de mogelijkheid geven om beide resultaten te laten weergeven middels een wildcard en dan als volgt: boo?sma. Dan dus een vraagteken ervoor in de plaats... Of moet ik dan écht gaan werken met regular expressions?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ...
function regexp_quote ( str ) {
   var chars = [ '/', '?', '+', '.', '{', '[', '(' ];
   for ( a in chars ) {
      str.replace ( chars[a], '\\' + chars[a] );
   }
   return str;
}
// ...
re = new RegExp ( regexp_quote ( strsearch ). replace ( '*', '.*' ) );
// snip
if ( re.test ( ff_namen[intperson].nm ) ) {
   // ...
}
// ...

Ik heb er helemaal niets van getest, maar volgens mij moet je een beetje die kant op :)

edit:
Woudloper:
Maar, weet jij wellicht hoe ik het volgende kan doen. Stel ik heb mensen met de naam: bootsma en boodsma in mijn array zitten en nu wil ik mensen de mogelijkheid geven om beide resultaten te laten weergeven middels een wildcard en dan als volgt: boo?sma. Dan dus een vraagteken ervoor in de plaats... Of moet ik dan écht gaan werken met regular expressions?
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
function regexp_quote ( str ) {
   var chars = [ '/', '+', '.', '{', '[', '(' ];
   for ( a in chars ) {
      str.replace ( chars[a], '\\' + chars[a] );
   }
   return str;
}
// ...
re = new RegExp ( regexp_quote ( strsearch ). replace ( '*', '.*' ).replace ( '?', '.' ) );
// snip
if ( re.test ( ff_namen[intperson].nm ) ) {
   // ...
}

:Y)

edit:
typo's en java voor de kleurtjes added

edit:
backslash escapen niet quotes |:(

[ Voor 52% gewijzigd door drm op 22-01-2003 11:42 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • André
  • Registratie: Maart 2002
  • Laatst online: 14:15

André

Analytics dude

Woudloper schreef op 22 januari 2003 @ 11:35:
Yogho :: Daar had ik nog niet aan gedacht! Dat is opzich wel een goede oplossing en die ga ik zeker implementeren...

Maar, weet jij wellicht hoe ik het volgende kan doen. Stel ik heb mensen met de naam: bootsma en boodsma in mijn array zitten en nu wil ik mensen de mogelijkheid geven om beide resultaten te laten weergeven middels een wildcard en dan als volgt: boo?sma. Dan dus een vraagteken ervoor in de plaats... Of moet ik dan écht gaan werken met regular expressions?
Dat denk ik wel, zoals drm al aangeeft kun je de sterretjes vervangen door .* en een ? word dan .{1} of zoiets.

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Fantastisch!

Het werkt en dat helemaal uit je hoofd getikt (drm?) Ik heb er na ICQ-contact met drm nog de optie: , 'i' aan toegevoegd en hij werkt zoals hij moet werken....

  • André
  • Registratie: Maart 2002
  • Laatst online: 14:15

André

Analytics dude

, 'i'

Wat doet dat dan?

Verwijderd

ignore case...

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Woudloper:
Fantastisch!

Het werkt en dat helemaal uit je hoofd getikt (drm?)
*bloos* ja :o
Ik heb er na ICQ-contact met drm nog de optie: , 'i' aan toegevoegd en hij werkt zoals hij moet werken....

Mooi :)

edit:
Ik heb trouwens niet met alle metacharacters rekening gehouden, zie ik... Je zou er ff een JS regexp reference op na moeten slaan welke characters allemaal meta-characters zijn in de JS implementatie, en die even toevoegen aan de array in regexp_quote () (ik ben alvast '$' en '^' al vergeten...)

[ Voor 34% gewijzigd door drm op 22-01-2003 13:53 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1