[PHP] Zoeken op termen binnen een string

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

Ben aan het knutselen voor de nieuwe UB-site, en zit hier met een functie die ik niet helemaal aan de praat krijg. Hebben jullie iedeetjes of suggesties hoe het wél / efficiënter kan?
Ik zou in een string (tekst dus) de aanwezigheid willen testen van een bepaald aantal termen. Het resultaat zou enkel een true of false moeten zijn.
Voorbeeldje: termen: "koe, schaap, konijn, varken"
Tekst: "in het bos liep een konijn rond met een wortel in zijn bek" -> true
"in het bos liep de boswachter rond met een wortel in zijn hand" -> false
Wat ik geprobeerd heb, maar blijkbaar niet werkt:

Code: Selecteer alles

<?php
$result = $db->query("SELECT `keyword` FROM `keywords`;");
$list = "(";
while ($row = $result->fetch_object) {
	$list .= $row->keyword . ")|(";
}
$list .= ")";
$resultaat = (eregi($list,"in het bos loopt een konijn")) ? TRUE : FALSE;
Zitten hier slimme koppen die iets, eventueel helemaal anders, kunnen verzinnen?
crapiecorn
Elite Poster
Elite Poster
Berichten: 2187
Lid geworden op: 01 feb 2003, 11:58
Uitgedeelde bedankjes: 44 keer
Bedankt: 12 keer

Je moet de zoekstring eens zonder qoutes gebruiken :

(test)|(test2)|(test3)

dan zou het moeten werken.

Je zou eventueel de functie in_array kunnen uitvoeren op je lijst.
simpel werkend voorbeeld :

Code: Selecteer alles

<?php
$list = array("test","test3","de","none","whoot");
$zoekwoorden = explode(" ", "niets foo whoot");

foreach ($zoekwoorden as $waarde){
	if(in_array($waarde, $list)) {
    	echo "true";
    }
}  
?>
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

in_array() zoekt toch enkel op exacte matches? Ik zoek dus wel degelijk een systeem om kernwoorden te zoeken in een langere tekst.
En ik gebruik toch geen quotes in de regexp op deze manier? Die dubbele aanhalingstekens dienen enkel als afsluiters van de string die ik opbouw.
crapiecorn
Elite Poster
Elite Poster
Berichten: 2187
Lid geworden op: 01 feb 2003, 11:58
Uitgedeelde bedankjes: 44 keer
Bedankt: 12 keer

Wat gaat er dan mis ? als ik met enkele voorbeelden probeer lijkt het toch te werken

Code: Selecteer alles

<?
if(eregi("(none) | (loopt)","in het bos loopt een konijn")){
 echo "gevonden";
}

if(!eregi("(none) | (niets)","in het bos loopt een konijn")){
 echo "niet gevonden";
}

if(eregi("(bos) | (loopt)","in het bos loopt een konijn")){
 echo "gevonden";
}

?>

saffie
Pro Member
Pro Member
Berichten: 390
Lid geworden op: 09 okt 2007, 09:24

Een heel tevreden dxADSL klant!
Afbeelding
BungaMan
Elite Poster
Elite Poster
Berichten: 1485
Lid geworden op: 16 nov 2005, 09:05

In de PHP manual staat een voorbeeld wat bijna hetzelfde is als ge zoekt

Code: Selecteer alles

<?php

    //check if user is a bot of some sort
function is_bot()
{
    $bots = array('google','yahoo','msn');
    //takes the list above and returns (google)|(yahoo)|(msn)
    $regex = '('.implode($bots, ')|(').')';
    /*uses the generated regex above to see if those keywords are contained in the user agent variable*/     
    return eregi($regex, $_SERVER['HTTP_USER_AGENT']);
}

?>
Kijk uw regex is na. Werkt het voorbeeld dat ge zelf gegeven hebt? Je moet ook rekening houden dat regex zich beperken tot een line break. Dan moet je de regex aanpassen naar iets als

$regex = '/(konijn)|(bijzonderkonijn)/s';

Je kan ook met preg_match proberen.

Kijk hier maar eens voor die modifiers.
Please help, looking for a way to get rich and fast
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16757
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 582 keer
Bedankt: 780 keer
Provider

saffie schreef:fulltext search ;)
Dat zou een oplossing zijn, moest de informatie die ik wil matchen uit een DB komen eh :P

En dat van die line breaks zou wel eens de reden kunnen zijn, ga het vanavond eens proberen
Plaats reactie

Terug naar “Development”