MYSQL REGEXP en wildcard

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ferdi R

Ferdi R

07/01/2018 17:49:46
Quote Anchor link
Ik heb een query die woorden uit de database haalt die de letters bevatten die in de string zitten.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
$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.
 
PHP hulp

PHP hulp

21/11/2024 19:45:20
 
Rob Doemaarwat

Rob Doemaarwat

07/01/2018 19:00:04
Quote Anchor link
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)?
 
Ferdi R

Ferdi R

07/01/2018 19:24:58
Quote Anchor link
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.

Toevoeging op 07/01/2018 19:57:57:

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.
 
Rob Doemaarwat

Rob Doemaarwat

07/01/2018 20:00:34
Quote Anchor link
Als je dan toch een "dubbele letter filter" hebt zou je het in geval van een wildcard zo kunnen doen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
^[letters]*[a-z][letters]*$
 
Ferdi R

Ferdi R

07/01/2018 20:04:10
Quote Anchor link
Misschien moet ik het anders doen want de extra letter moet ook aan #str_search toegevoegd worden om het door de filter te halen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
            $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
 
Thomas van den Heuvel

Thomas van den Heuvel

08/01/2018 00:16:27
Quote Anchor link
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_' ...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.