Ik heb een query die woorden uit de database haalt die de letters bevatten die in de string zitten.


$str_search = 'kbleismtr';

$otvsql = "SELECT woord FROM woorden_feud WHERE woord REGEXP '^[{". mysqli_real_escape_string($DBconn, $str_search)."}]+$'";

// Haalt bv de woorden klim, biet, trim ect op


Nu wil ik de vraagteken ? als wildcard gebruiken, dus als mensen deze erbij invoeren dat er wordt gezocht met de letters:

$str_search = 'kbleismtra'; // met a erbij
$str_search = 'kbleismtrb'; // met b erbij
$str_search = 'kbleismtrc'; // met c erbij

Tot en met z.

Nu zat ik te denken om dat met een foreach loop te doen met de letters a tot en met z maar dat gaat niet ivm de laadtijd.

Hoe kan ik de REGEXP aanpassen dat er woorden opgehaald kunnen worden met een wildcard.
Even wat dingen duidelijk krijgen:
- Waarom staan die accolades d'r in ( ^[letters]+$ is voldoende)?
- Als je zoekt op de letters 'hio' vind je nu 'hoi', maar ook 'hooi'. Is dat de bedoeling (ik zie een verwijzing naar Word Feud - volgens mij heb je daar een beperkte collectie letters, net als bij Scrabble)?
- Moeten alle letters d'r in zitten, of zoek je gewoon alle woorden met 1 of meer van de letters (zo werkt het nu - dus met je voorbeeld van 'kbleismtr' vind je 'mis', 'blik', 'klemt', enz)?
Voor de woorden met dubbele letters heb ik een filter/functie gemaakt met PHP.

Niet alle letters hoeven erin te zitten, als er maar woorden van gemaakt kunnen worden.

[size=xsmall]Toevoeging op 07/01/2018 19:57:57:[/size]

Dus ik wou graag weten hoe ik de REGEXP kan aanpassen dat er ook woorden gevonden worden met een extra letter.

REGEXP '^[". mysqli_real_escape_string($DBconn, $str_search)."]+$'
REGEXP '^[". mysqli_real_escape_string($DBconn, $str_search)."]+[a-z]+$' ?????????????

Maar er mag met de wildcard dan maar 1 letter per woord erbij komen.
Als je dan toch een "dubbele letter filter" hebt zou je het in geval van een wildcard zo kunnen doen
^[letters]*[a-z][letters]*$
Misschien moet ik het anders doen want de extra letter moet ook aan #str_search toegevoegd worden om het door de filter te halen.


			$alphas = range('a', 'z');
			
			for($i = 0; $i < count($alphas); $i++) {
				
				$str_search = str_replace('?', $alphas[$i], $str_search);
				
				$otvsql = "SELECT woord FROM woorden_feud WHERE woord REGEXP '^[". mysqli_real_escape_string($DBconn, $str_search)."]+$'";
			}



Dit werkt nu gedeeltelijk, alleen met de A. ook gooit hij de woorden 24 x dubbel
Als de positie van de ontbrekende letter(s) vast is, zou je ook LIKE kunnen gebruiken in combinatie met de underscore (_)? Een underscore duidt een enkel karakter aan.

In bovenstaande situatie wordt dat dus zoiets als ... WHERE woord LIKE 'kbleismtr_' ...

Reageren