file_get_contents + preg_match > vind regel met word
Ik heb een lijst met woorden in een txt file, 400 en meer, op elke regel 1 woord.
Op mijn site worden de zoekwoorden opgeslagen in bovengenoemde text file.
Nu kan een Admin deze txt doorzoeken of een woord hierin voorkomt met een input search.
Wat ik ook probeer ik krijg niet de gewenste regelnummer waarop dat woord staat.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$dosearch = trim($_POST['dosearch']);
$mysearch = file_get_contents("search/search.log");
preg_match('/^MyParam[^\r\n]*/m', $text, $matches);
var_dump($matches[0]);
$mysearch = file_get_contents("search/search.log");
preg_match('/^MyParam[^\r\n]*/m', $text, $matches);
var_dump($matches[0]);
Ik krijg het maar niet voor elkaar om MyParam te weizigen in de variabel $dosearch
Weet iemand wellicht hoe dit te doen?
Even naar beneden scrollen bij het kopje offset.
https://www.php.net/manual/en/function.preg-match.php
Er word een voorbeeld gegeven $pattern = '/^def/'; waarin op def word gezocht.(in mijn voorbeeld is dat MyParam)
Ik wil nu zoeken op een variable, dus ipv def zoeken op $dosearch
Maar dan heb je nog steeds niet de index ...
Maar als het doel is "een woord in een array vinden" (en niet "een deel van een woord"), dan kan je ook
Code (php)
1
2
2
$words = file("search/search.log",FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$index = array_search($dosearch,$words); //false indien niet gevonden
$index = array_search($dosearch,$words); //false indien niet gevonden
En als je ook op een deel van een woord wilt matchen:
Code (php)
1
2
3
4
2
3
4
$words = file("search/search.log",FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach($words as $index => $word)
if(stripos($word,$dosearch) !== false)
print("Het gezochte woord staat op regel $index\n");
foreach($words as $index => $word)
if(stripos($word,$dosearch) !== false)
print("Het gezochte woord staat op regel $index\n");
Opmerkingen:
- begint bij 0 te tellen, dus $index = 5 is "regel 6"
- gebruik strpos() ipv stripos() als je case sensitive wilt zoeken
- gebruik === 0 ipv !== false als de gezochte tekst aan het begin van het woord moet staan
- niet elk probleem is een regex ;-)
Gewijzigd op 24/02/2025 19:44:31 door Rob Doemaarwat
stripos geeft inderdaad ook een deel van een woord.. dus zoeken op wagenwiel geeft als eerste resultaat "wagen"
Maar ik ga weer aan de slag en laat het weten..
meer info:
Ik had deze om een exact woord te zoeken in een lijst en werkt prima (niet hoofdletter gevoelig)
maar op welke regel deze staat??
deze werkt helaas niet...
Gewijzigd op 24/02/2025 20:14:17 door Vink Jansen
Dan splitst php het direct voor je op in losse regels. Of in woorden als er 1 woord per regel staat.
Dan zoek je in je array en vind je de regel (al dan niet +/-1)
Maar, wat als je na verloop van tijd 85000 woorden/ regels in je file hebt?
Dan wordt het zwaarder en zwaarder.
En wat doe je met dubbelen?
Waarom geen gebruik gemaakt van een database? Dan kun je ook meer info kwijt, zoals een tijdstip bijvoorbeeld.
Gewijzigd op 24/02/2025 20:50:18 door Ivo P
Ik wil jullie graag zeer bedanken voor de suggesties!
Nu, na veel proberen heb ik eindelijk het gewenste resultaat en wil dat graag delen.
test.php
een geweldige jquery plugin om een textarea van regelnummers te voorzien:
JQueryLinedText
en de gebruikte code om een woord te zoeken in de lijst
Wat kan er in je file staan?
Zoek je in "de kar heeft 4 wagenwielen"
of staan die woorden los?
En als je zoekt op "wagen" wil je dan wel of niet "wagenwielen" vinden?
preg-functies zijn vaak niet heel efficiënt als je op vaste tekst zoekt. Die zijn meer bedoeld om te zoeken naar "een getal gevolgd door een tekst waarin Wiel" staat."
Het is na veel moeite gelukt om de titel en omschrijving van alle advertenties te doorzoeken op 1 zoekwoord.
De meeste zoekmachines die ik gezien heb werken alle met LIKE.. dit geeft net als strpos ook delen van woorden als resultaat
Dat werkt vooralsnog best wel goed maar je hebt gelijk dat zoeken op een combinatie van woorden beter is.
Soms merk je dat zelfs Marktplaats hier moeite mee heeft.. :)
Gewijzigd op 25/02/2025 16:45:50 door Vink Jansen
Je kan natuurlijk ook met Sphinx of ElasticSearch in de weer gaan om een goede zoekbackend op te zetten als je echt heel veel data hebt.