Zoeken van meerdere woorden met preg_match?
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');
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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>';
?>
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>';
?>
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
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 ;-)
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:
Hmm, nou laat ik er maar een 'of iets dergelijks' bij zetten, want dit klopt van geen kanten denk ik.
Enig idee?
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.
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.
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
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.
Code (php)
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
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>';
}
?>
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>';
}
?>
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