Scheldwoorden eruit halen
Ik heb een script gemaakt om er voor te zorgen dat als iemand scheld dat dat woord word verwijderd en dat ik een melding krijg. Ik heb nu dit script:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
$words = array('yolo', 'scheld');
$found = array();
foreach($words AS $word) {
$_GET['r'] = strtolower($_GET['r']);
$_GET['r'] = str_replace('.', '', $_GET['r']);
$_GET['r'] = str_replace('-', '', $_GET['r']);
$_GET['r'] = str_replace('<', '', $_GET['r']);
$_GET['r'] = str_replace('>', '', $_GET['r']);
$_GET['r'] = str_replace(',', '', $_GET['r']);
$_GET['r'] = str_replace('_', '', $_GET['r']);
$_GET['r'] = str_replace('+', '', $_GET['r']);
$_GET['r'] = str_replace('/', '', $_GET['r']);
$_GET['r'] = str_replace('\\', '', $_GET['r']);
$_GET['r'] = str_replace('!', '', $_GET['r']);
$_GET['r'] = str_replace('@', '', $_GET['r']);
$_GET['r'] = str_replace('#', '', $_GET['r']);
$_GET['r'] = str_replace('$', '', $_GET['r']);
$_GET['r'] = str_replace('%', '', $_GET['r']);
$_GET['r'] = str_replace('^', '', $_GET['r']);
$_GET['r'] = str_replace('&', '', $_GET['r']);
$_GET['r'] = str_replace('*', '', $_GET['r']);
$_GET['r'] = str_replace('(', '', $_GET['r']);
$_GET['r'] = str_replace(')', '', $_GET['r']);
$_GET['r'] = str_replace('?', '', $_GET['r']);
$_GET['r'] = str_replace('~', '', $_GET['r']);
$_GET['r'] = str_replace('`', '', $_GET['r']);
$_GET['r'] = str_replace('{', '', $_GET['r']);
$_GET['r'] = str_replace('}', '', $_GET['r']);
$_GET['r'] = str_replace('[', '', $_GET['r']);
$_GET['r'] = str_replace(']', '', $_GET['r']);
$_GET['r'] = str_replace(':', '', $_GET['r']);
$_GET['r'] = str_replace(';', '', $_GET['r']);
$_GET['r'] = str_replace('¨', '', $_GET['r']);
$_GET['r'] = str_replace('¨', '', $_GET['r']);
$_GET['r'] = str_replace('^', '', $_GET['r']);
echo $_GET['r'].'<br>';
$find = strpos($word, $_GET['r']);
if($find === true) {
$found[] = $word;
}
//unset($find);
}
if(count($found) != 0) {
echo 'ja';
} else {
echo 'nee';
}
?>
$words = array('yolo', 'scheld');
$found = array();
foreach($words AS $word) {
$_GET['r'] = strtolower($_GET['r']);
$_GET['r'] = str_replace('.', '', $_GET['r']);
$_GET['r'] = str_replace('-', '', $_GET['r']);
$_GET['r'] = str_replace('<', '', $_GET['r']);
$_GET['r'] = str_replace('>', '', $_GET['r']);
$_GET['r'] = str_replace(',', '', $_GET['r']);
$_GET['r'] = str_replace('_', '', $_GET['r']);
$_GET['r'] = str_replace('+', '', $_GET['r']);
$_GET['r'] = str_replace('/', '', $_GET['r']);
$_GET['r'] = str_replace('\\', '', $_GET['r']);
$_GET['r'] = str_replace('!', '', $_GET['r']);
$_GET['r'] = str_replace('@', '', $_GET['r']);
$_GET['r'] = str_replace('#', '', $_GET['r']);
$_GET['r'] = str_replace('$', '', $_GET['r']);
$_GET['r'] = str_replace('%', '', $_GET['r']);
$_GET['r'] = str_replace('^', '', $_GET['r']);
$_GET['r'] = str_replace('&', '', $_GET['r']);
$_GET['r'] = str_replace('*', '', $_GET['r']);
$_GET['r'] = str_replace('(', '', $_GET['r']);
$_GET['r'] = str_replace(')', '', $_GET['r']);
$_GET['r'] = str_replace('?', '', $_GET['r']);
$_GET['r'] = str_replace('~', '', $_GET['r']);
$_GET['r'] = str_replace('`', '', $_GET['r']);
$_GET['r'] = str_replace('{', '', $_GET['r']);
$_GET['r'] = str_replace('}', '', $_GET['r']);
$_GET['r'] = str_replace('[', '', $_GET['r']);
$_GET['r'] = str_replace(']', '', $_GET['r']);
$_GET['r'] = str_replace(':', '', $_GET['r']);
$_GET['r'] = str_replace(';', '', $_GET['r']);
$_GET['r'] = str_replace('¨', '', $_GET['r']);
$_GET['r'] = str_replace('¨', '', $_GET['r']);
$_GET['r'] = str_replace('^', '', $_GET['r']);
echo $_GET['r'].'<br>';
$find = strpos($word, $_GET['r']);
if($find === true) {
$found[] = $word;
}
//unset($find);
}
if(count($found) != 0) {
echo 'ja';
} else {
echo 'nee';
}
?>
Als de GET Waarde R nu bijvoorbeeld 'yolo' is zegt het script nee, terwijl yolo wel gewoon in de array staat. Hoe kan ik dit oplossen?
str_replace op php.net gelezen?
En als je dan toch op php.net bezig bent, ook even kijken naar de beschrijving van strpos:
De handleiding op php.net is er niet voor niets, gebruik het.
Volgens mij kan je zo 30 regels overbodige code uit je script halen.... Weleens de beschrijving van Quote:
search: The value being searched for, otherwise known as the needle. An array may be used to designate multiple needles.
En als je dan toch op php.net bezig bent, ook even kijken naar de beschrijving van strpos:
Quote:
Returns the position of where the needle exists relative to the beginning of the haystack string (independent of offset). Also note that string positions start at 0, and not 1.
De handleiding op php.net is er niet voor niets, gebruik het.
1) Opschonen van de binnenkomende string
2) Woorden zoeken in de opgeschoonde tekst
Het opschonen kan nog efficienter met preg_replace. Je hebt dan waarschijnlijk aan 1 pattern genoeg, iets in de geest van:
(dit haalt wellicht nog wat meer karakters weg. Je kunt ook alle karakters die je wilt verwijderen er in zetten na tussen [ en voor ] maar dan moet je die nog wel escapen dus dat is wat meer uitzoekwerk).
preg_ is in moderne versies van PHP zowiezo vaak sneller omdat er een optimalisatie in zit voor patterns die je opnieuw gebruikt (werkt ook over meerdere aanroepen van je script heen).
Verder wil je misschien op hele woorden zoeken in plaats van op lettercombinaties. Want jouw script ziet volgens mij 'De schelde is een mooie rivier' als schelden. Dat kun je natuurlijk doen door spaties om je scheldwoorden heen op te nemen, en ook spaties om $opgeschoond heen. Maar dan moet je eigenlijk ook eerst in $opgeschoond harde returns en zo vervangen door spaties. Het kan ook in een keer met preg_match_all door om de gezochte woorden aan weerszijden een '/s' op te nemen, gescheiden door |. Een totaalpattern kun je dan maken met:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$pattern = '~/s';
forEach($words as $i => $word) {
$pattern .= $word;
if ($i > 0) $pattern .= '/s|/s';
}
$pattern .= '/s~i';
forEach($words as $i => $word) {
$pattern .= $word;
if ($i > 0) $pattern .= '/s|/s';
}
$pattern .= '/s~i';
Dit zou met array('yolo', 'scheld') het pattern '~/syolo/s|/sscheld/s~i' moeten geven.
Deze werkt dankzij de i op het einde hoofdletter-ongevoelig. Je moet ook hier wel spaties rond $opgeschoond toevoegen anders mis je scheldwoorden aan het begin en het einde:
N.B. ik heb de patterns niet getest. Meestal doen mijn patterns het pas na wat debuggen, dus dat kan nog wat puzzelen zijn.
Gewijzigd op 09/12/2012 10:51:52 door Henk Verhoeven