Zoeken van meerdere woorden met preg_match?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Kvdd

kvdd

23/07/2007 20:45:00
Quote Anchor link
Beste allemaal,

Momenteel heb ik het volgende script ontwikkeld om 1 tekst te controleren op meerdere woorden. (Dus een string zoeken in een string).

$words = array('word1','word2','word3','word4','word5');

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
if (preg_match($words,$tekst)){
  // Doe iets!
}


Maar nou vraag ik me de volgende dingen af:

1) Waarom werkt dit niet?

2) Het is sneller met strpos() of strstr() heb ik gelezen, hoe moet dat dan?

Ik hoop dat de bedoeling duidelijk is, ik kom er echt niet uit. Ook niet met www.php.net/preg_match :-(
Gewijzigd op 01/01/1970 01:00:00 door Kvdd
 
PHP hulp

PHP hulp

08/11/2024 11:29:37
 
Jan Koehoorn

Jan Koehoorn

23/07/2007 21:22:00
Quote Anchor link
Zo zou het moeten lukken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    ini_set ('display_errors', 1);
    error_reporting (E_ALL);

    $woorden = array ('/fox/', '/dog/');
    $zin1 = 'the quick brown fox jumped over the lazy dog';
    $zin2 = 'dit is een willekeurige zin waar de zoekwoorden niet in voorkomen';
    $gevonden = false;

    foreach ($woorden as $woord) {
        if (preg_match ($woord, $zin1)) $gevonden = true;
    }

    $welniet = ($gevonden) ? ('wel') : ('geen');
    echo '<p>In de zin <em>' . $zin1 . '</em> zijn <strong>' . $welniet . '</strong> resultaten gevonden</p>';

    $gevonden = false;
    foreach ($woorden as $woord) {
        if (preg_match ($woord, $zin2)) $gevonden = true;
    }

    $welniet = ($gevonden) ? ('wel') : ('geen');
    echo '<p>In de zin <em>' . $zin2 . '</em> zijn <strong>' . $welniet . '</strong> resultaten gevonden</p>';
?>
 
Kvdd

kvdd

23/07/2007 22:00:00
Quote Anchor link
Aha! Dat ga ik morgen maar eens op mijn gemak uitzoeken.

Nu ik het zo doorlees, denk ik dat het bijna geheel op mij van toepassing is.
Behalve dan dat ik één variable heb, en niet twee zoals in je voorbeeld (zin1 en zin2). Maar gelukkig zit de mogelijkheid om met meerdere woorden te zoeken er wel in.

Ik denk dat het wel gaat lukken Jan!

En anders hoor je er nog wel van :-)

PS: als ik nu twee woorden tegelijk wil matchen wil het true zijn, doe ik dat?
Ik denk zelf aan een if-statement.
Gewijzigd op 01/01/1970 01:00:00 door kvdd
 
Jan Koehoorn

Jan Koehoorn

23/07/2007 22:02:00
Quote Anchor link
De woorden waarnaar je wilt zoeken, stop je in de array $woorden. Ik had twee zinnen gegeven om te laten zien wat er gebeurt als je wel iets vindt en als je niets vindt ;-)
 
Kvdd

kvdd

23/07/2007 22:11:00
Quote Anchor link
Aha, dankje Jan :-)

Nu ik me PS overlees, denk ik dat ik misschien in de variable $woorden (als ik fox en dog tegelijk wil matchen) het zo zou moeten omschrijven:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$woorden = array ('/fox/', '/dog/',/fox^dog/');


Hmm, nou laat ik er maar een 'of iets dergelijks' bij zetten, want dit klopt van geen kanten denk ik.

Enig idee?
 
Jan Koehoorn

Jan Koehoorn

23/07/2007 22:13:00
Quote Anchor link
Nee, je moet gewoon een array maken met alle woorden die je wilt matchen. Zorg ervoor dat ze met een slash beginnen en eindigen, anders werkt preg_match niet. Ga geen gekke tekens zoals ^ in de array-elementen zetten, want die hebben binnen regexen een speciale betekenis.
 
Kvdd

kvdd

23/07/2007 22:17:00
Quote Anchor link
Dankje dat is duidelijk dan. Maar wat ik graag zou willen is een functie erbij (hoeft niet persee in die variable $woorden hoor) die er voor zorgt dat $gevonden pas true is als 2 woorden tegelijk in een tekst voorkomen.

Laat ik het zo uitleggen, het woord fox heeft een waarde van 100% en dog ook. Dus 1 match en true. Maar cat en birth is helemaal niet zo verkeerd, en geef ik allebei (alst ware) de waarde van 50%, en zijn dus bij mekaar 100, en dan pas true.
 
Jan Koehoorn

Jan Koehoorn

23/07/2007 22:19:00
Quote Anchor link
Dus je wilt minstens twee woorden vinden? Moet ik het scriptje even herschrijven. Momentje.
Edit:
Wacht eens even, je wilt gewicht toekennen aan gevonden woorden? Dan wordt het script wel ietsje ingewikkelder.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Kvdd

kvdd

23/07/2007 22:22:00
Quote Anchor link
Ja, maar ik gebruik je bovenstaande script ook. Het gaat me erom dat ik dus beide kan gebruiken. Als dat niet gaat, dan houd ik me aan het bovenstaande van jou.
 
Jan Koehoorn

Jan Koehoorn

23/07/2007 22:32:00
Quote Anchor link
Hier, een update:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
    ini_set ('display_errors', 1);
    error_reporting (E_ALL);

    $woorden = array (
        array ('/fox/', 50),
        array ('/dog/', 50)
    );

    
    $zin1 = 'the quick brown fox jumped over the lazy dog';
    $zin2 = 'dit is een willekeurige zin waar de zoekwoorden niet in voorkomen';
    $n = count ($woorden);

    $score = 0;
    for ($i = 0; $i < $n; $i++) {
        if (preg_match ($woorden[$i][0], $zin1)) {
            $score += $woorden[$i][1];
        }
    }

    if ($score >= 100) {
        echo '<p>In de zin <em>' . $zin1 . '</em> is de score voor de gevonden woorden 100 of meer</p>';
    }

    else {
        echo '<p>In de zin <em>' . $zin1 . '</em> is de score voor de gevonden woorden minder dan 100</p>';
    }

    $score = 0;
    for ($i = 0; $i < $n; $i++) {
        if (preg_match ($woorden[$i][0], $zin2)) {
            $score += $woorden[$i][1];
        }
    }

    if ($score >= 100) {
        echo '<p>In de zin <em>' . $zin2 . '</em> is de score voor de gevonden woorden 100 of meer</p>';
    }

    else {
        echo '<p>In de zin <em>' . $zin2 . '</em> is de score voor de gevonden woorden minder dan 100</p>';
    }

?>
 
Kvdd

kvdd

24/07/2007 08:35:00
Quote Anchor link
Harstikke bedankt Jan, ik snap de code, en ga er mee aan de slag!

Toch heb ik nog een vraag,

Hoe zorg ik er voor dat Dog en dOg ook gematcht worden? Nu wordt alleen dog met lowercase gematcht.

Iemand enig idee?

Edit:
Heb het al! in de het zo omschrijven: array ('/dog/i', 50)
Gewijzigd op 01/01/1970 01:00:00 door kvdd
 



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.