Pagina 1 van 1

[PHP] Zoeken op termen binnen een string

Geplaatst: 01 okt 2008, 23:12
door meon
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?

Geplaatst: 01 okt 2008, 23:23
door crapiecorn
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";
    }
}  
?>

Geplaatst: 02 okt 2008, 09:58
door meon
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.

Geplaatst: 02 okt 2008, 13:13
door crapiecorn
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";
}

?>


Geplaatst: 02 okt 2008, 13:21
door saffie

Geplaatst: 02 okt 2008, 13:38
door BungaMan
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.

Geplaatst: 02 okt 2008, 14:08
door meon
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