Hi!

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.
$dosearch = trim($_POST['dosearch']);

 $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?
Zeer bedankt voor de snelle reactie!.. het probleem blijft echter bestaan.
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
Zoiets?

[code]preg_match('/^' . $dosearch . '[^\r\n]*/m', $mysearch, $matches);[\code]
Dan wel de zoekterm escapen:
preg_match('/^' . preg_quote($dosearch,'/') . '[^\r\n]*/m', $mysearch, $matches);


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

$words = file("search/search.log",FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$index = array_search($dosearch,$words); //false indien niet gevonden


En als je ook op een deel van een woord wilt matchen:

$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");


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 ;-)
Hi!

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)
if (preg_match("~\b$dosearch\b~i",$mysearch) )

maar op welke regel deze staat??
preg_match('/^' . preg_quote($dosearch,'/') . '[^\r\n]*/m', $mysearch, $matches);

deze werkt helaas niet...
Ik zou zoals Rob al noemt file() gebruiken ipv file_get_contents().
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.
Hi,
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
key(preg_grep("/$dosearch/i", file($wordfile))) + 1;


Ik ben nog wel benieuwd of je zoekt in losse woorden en die dan geheel wilt vinden.

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."
Ik begrijp wat je bedoeld maar heb gemerkt dat het vreselijk moeilijk is om een goede zoekmachine te bouwen.
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.. :)
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.

Reageren