file_get_contents + preg_match > vind regel met word

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Vink Jansen

Vink Jansen

24/02/2025 17:37:55
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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]);


Ik krijg het maar niet voor elkaar om MyParam te weizigen in de variabel $dosearch
Weet iemand wellicht hoe dit te doen?
 
PHP hulp

PHP hulp

17/03/2025 03:13:37
 
Adoptive Solution

Adoptive Solution

24/02/2025 17:45:30
Quote Anchor link
Op deze pagina staat een voorbeeld hoe je variabelen gebruikt.

Even naar beneden scrollen bij het kopje offset.

https://www.php.net/manual/en/function.preg-match.php
 
Vink Jansen

Vink Jansen

24/02/2025 18:04:58
Quote Anchor link
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
 
Adoptive Solution

Adoptive Solution

24/02/2025 18:21:11
Quote Anchor link
Zoiets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
preg_match('/^' . $dosearch . '[^\r\n]*/m', $mysearch, $matches);[\code]
Gewijzigd op 24/02/2025 18:21:52 door Adoptive Solution
 
Rob Doemaarwat

Rob Doemaarwat

24/02/2025 19:39:28
Quote Anchor link
Dan wel de zoekterm escapen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");


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
 
Vink Jansen

Vink Jansen

24/02/2025 19:57:57
Quote Anchor link
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)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (preg_match("~\b$dosearch\b~i",$mysearch) )

maar op welke regel deze staat??
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
preg_match('/^' . preg_quote($dosearch,'/') . '[^\r\n]*/m', $mysearch, $matches);

deze werkt helaas niet...
Gewijzigd op 24/02/2025 20:14:17 door Vink Jansen
 
Ivo P

Ivo P

24/02/2025 20:38:44
Quote Anchor link
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.
Gewijzigd op 24/02/2025 20:50:18 door Ivo P
 
Vink Jansen

Vink Jansen

25/02/2025 12:19:34
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
key(preg_grep("/$dosearch/i", file($wordfile))) + 1;
 
Ivo P

Ivo P

25/02/2025 15:16:23
Quote Anchor link
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."
 
Vink Jansen

Vink Jansen

25/02/2025 16:39:57
Quote Anchor link
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.. :)
Gewijzigd op 25/02/2025 16:45:50 door Vink Jansen
 
- Ariën  -
Beheerder

- Ariën -

27/02/2025 16:54:51
Quote Anchor link
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.
 



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.