[PHP] Stoppen bij gebruik van bepaald woord

Pagina: 1
Acties:
  • 143 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tweaqer
  • Registratie: November 2002
  • Laatst online: 14-07 20:43
Beste dames en heren,

Ik ben momenteel aan het stuntelen met een gastenboekje in PHP, maar ik kom er niet helemaal uit. Het punt is dat ik in het verleden wel eens in mijn gastenboek mensen dingen heb zien schrijven waar ik niet blij van werd. Het punt is dat er veel oplossingen zijn om str_replace toe te passen en bepaalde woorden te vervangen door sterretjes, maar dat is niet wat ik zoek. Ik wil graag dat als een bepaald woord voorkomt dat er een berichtje komt van "bepaalde woorden die u gebruikt heeft zijn niet toegestaan". Zoiets. Anywayz, dit is wat ik zo'n beetje al verzonnen had, maar echt werken doet het niet. Zouden jullie misschien wat tips kunnen geven om mij op weg te helpen? :)

note: sorry voor misschien vaag topic, maar kon niet helemaal tot een goed topic komen, mijn excuses.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$zoeknaar_1  = 'woord1';
$zoeknaar_2  = 'woord2';
$zoeknaar_3  = 'woord3';
$zoeknaar_4  = 'woord4';
$zoeknaar_5  = 'woord5';

// aantal foute woorden
$y = 5;
$x = 0;

while ($x <= $y) {

    $pos = strpos($bericht, $zoeknaar_1);
    $x++;

    if ($pos === true) {
    $resultaat_woord_check = "ja ";
    } 
}

if ($resultaat_woord_check != "") {
echo "Het gebruik van bepaalde woorden in uw bericht is niet toegestaan";
}

[ Voor 16% gewijzigd door Tweaqer op 30-07-2006 14:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Kijk eens in de manual bij de strpos functie. Wanneer returnt die functie true? Nooit dus.
Verder: gebruik een array voor de verboden woorden.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tweaqer
  • Registratie: November 2002
  • Laatst online: 14-07 20:43
Verwijderd schreef op zondag 30 juli 2006 @ 14:48:
Kijk eens in de manual bij de strpos functie. Wanneer returnt die functie true? Nooit dus.
Verder: gebruik een array voor de verboden woorden.
Dat zijn inderdaad twee goeie opmerkingen :)
Hey dat is inderdaad een erg handige functie! Die ga ik nu combineren met die array tip van Cheatah :)
Bedankt! :)

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Opmerking, als $pos false is zal $resultaat_woord_check niet bestaan. Je kan hem dus 1) initialiseren bovenaan je script met $resultaat_woord_check = ''; of die laatste controle uitbreiden naar if (isset($resultaat_woord_check) && $resultaat_woord_check != ""). Verder is het ook handig om je woorden in een array te stoppen.

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Tweaqer
  • Registratie: November 2002
  • Laatst online: 14-07 20:43
Nogmaals bedankt voor alle tips, ik ben tot de volgende code gekomen:

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
$fwoorden = array(
1 => "woord1",
2 => "woord2",
3 => "woord3",
4 => "woord4",
5 => "woord5"
);

// aantal foute woorden
$y = count($fwoorden);
$x = 0;
$resultaat_woord_check = "";

while ($x <= $y) {

    $zoektocht = substr_count($bericht, $fwoorden["$x"]);
    $x++;

    if ($zoektocht > 0) {
    $resultaat_woord_check = "ja ";
    } 
}

if ($resultaat_woord_check != "") {
echo "Het gebruik van bepaalde woorden in uw bericht is niet toegestaan";
}
else {
$query = mysql();
}

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
$fwoorden["$x"] => $fwoorden[$x] (klikkerdeklik)
Verder start je array op 1 en $x op 0, zet error_reporting(E_ALL) eens bovenaan je script ;)

[ Voor 33% gewijzigd door XWB op 30-07-2006 15:29 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Angelgamer schreef op zondag 30 juli 2006 @ 14:44:
PHP:
1
2
3
    if ($pos === true) {
    $resultaat_woord_check = "ja ";
    }
Waarom gebruik je eerst een boolean constant in je if-statement en dan vervolgens een string "ja" in de regel daaronder? Dat laatste is echt not-done. Ja/Nee waarden sla je op als boolean variabelen en niet als een string met "ja" of "nee" of iets dergelijks erin. Dat is enorm foutgevoellig. De test die je vervolgens op die variabele doet zou bijvoorbeeld ook gewoon true teruggeven als je er "nee" of "Hallo" in had gezet. Het is niet een erg logische constructie. Maak een variabele en zet die op false voordat je de loop ingaat, en zet hem binnen de loop op true als je iets gevonden hebt. En na de loop test je de waarde van deze variabele.

http://www.php.net/manual/en/language.types.boolean.php

Acties:
  • 0 Henk 'm!

  • Tweaqer
  • Registratie: November 2002
  • Laatst online: 14-07 20:43
Ik had trouwens nog een foutje gemaakt, die substr_count is case-sensitive dus heb ik
$zoektocht = substr_count($bericht, $fwoorden["$x"]); veranderd naar $zoektocht = substr_count(strtolower($bericht), $fwoorden["$x"]);

edit en de "" weggehaald ;) thanks hacku

[ Voor 15% gewijzigd door Tweaqer op 30-07-2006 15:37 ]


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Nu we toch bezig ziijn, een array kan je simpelweg met foreach() aflopen. Dan heb je $x en $y niet nodig. Voor ja/nee gebruiken we beter een bool:

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
$fwoorden = array(
1 => "woord1",
2 => "woord2",
3 => "woord3",
4 => "woord4",
5 => "woord5"
);

$resultaat_woord_check = false;
$bericht = "woord1";

foreach ($fwoorden as $key => $value) 
{
    $zoektocht = substr_count($bericht, $value[$key]);

    if ($zoektocht > 0) 
    {
        $resultaat_woord_check = true;
        break;
    } 
}

if ($resultaat_woord_check === true) 
{
    echo "Het gebruik van bepaalde woorden in uw bericht is niet toegestaan";
}

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Tweaqer
  • Registratie: November 2002
  • Laatst online: 14-07 20:43
Hacku schreef op zondag 30 juli 2006 @ 15:39:
Nu we toch bezig ziijn, een array kan je simpelweg met foreach() aflopen. Dan heb je $x en $y niet nodig. Voor ja/nee gebruiken we beter een bool:
Was een goede tip om eventjes error_reporting(E_ALL) te adden aan mijn eerder gemaakte code :) Trouwens deze code is inderdaad een stuk schoner, overzichtelijker en logischer! Thanks _/-\o_

[ Voor 3% gewijzigd door Tweaqer op 30-07-2006 15:49 ]


Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Ik heb het op deze manier gedaan voor mijn weblog en gastenboek:
PHP:
1
2
3
4
5
// check verboden woorden
$berichtcheck=strtolower($bericht);
$dezedoennietmee = "(casino|viagra|baccarat|slots|gambling|medication|rmine|phente|phentermine|dirare|yellow|online|yellowpages|levitra|cialis|centralbest|lmb.dp.ua|halpinos|pokerpacific|bible|poker|wrkplace|hold-em|croupier|roulette|busntech|ringtone)"; 

if (eregi($dezedoennietmee,$berichtcheck)) { echo "error"; exit(); }

De foutafhandeling is wel erg banaal, maar het gaat hier toch om spammers.

[ Voor 3% gewijzigd door Noork op 30-07-2006 16:57 ]


Acties:
  • 0 Henk 'm!

  • Tweaqer
  • Registratie: November 2002
  • Laatst online: 14-07 20:43
Ik heb trouwens nog wel een probleem met de code :'( ;

Warning: substr_count() [function.substr-count]: Empty substring. in /var/www/hosts/bericht.php on line 14
Bij $zoektocht = substr_count($bericht, $value[$key]);
Hoe moet dat oplossen? Ik gebruik de code zoals Hacku die net gepost heeft.

[ Voor 11% gewijzigd door Tweaqer op 30-07-2006 16:37 ]


Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 18:29
Angelgamer schreef op zondag 30 juli 2006 @ 16:36:
Ik heb trouwens nog wel een probleem met de code :'( ;

Warning: substr_count() [function.substr-count]: Empty substring. in /var/www/hosts/bericht.php on line 14
Bij $zoektocht = substr_count($bericht, $value[$key]);
Hoe moet dat oplossen? Ik gebruik de code zoals Hacku die net gepost heeft.
je kunt de warning onderdrukken door @ voor te voegen.. of bedoel je een _echte_ oplossing ;)

MT Venus E 5KW (V151) P1 HomeWizard | Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be | 9800X3D, 96GB DDR5 6000MHZ, NVIDIA GEFORCE 4090, ASRock X670E Steel Legend, Seasonic GX1000


Acties:
  • 0 Henk 'm!

  • Tweaqer
  • Registratie: November 2002
  • Laatst online: 14-07 20:43
Icekiller2k6 schreef op zondag 30 juli 2006 @ 16:40:
[...]


je kunt de warning onderdrukken door @ voor te voegen.. of bedoel je een _echte_ oplossing ;)
hehe ten minste 'n beetje echt :P

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
$value[$key] moet gewoon $value zijn (of $fwoorden[$key], maar dat is minder imo). Het $key => gedeelte in de foreach kan er ook helemaal uit trouwens.

En nog iets, array items worden automagisch geindiceerd, dus het is een beetje overbodig om ze zelf zo een nummertje te geven.

[ Voor 32% gewijzigd door Michali op 30-07-2006 16:46 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Mr. Bondt
  • Registratie: Februari 2005
  • Laatst online: 27-08 14:50
PHP:
1
2
3
4
5
6
7
8
9
10
foreach ($fwoorden as $key => $value) 
{
    $zoektocht = substr_count($bericht, $value[$key]);

    if ($zoektocht > 0) 
    {
        $resultaat_woord_check = true;
        break;
    } 
}

Gaat ook echt werken, hè?
Dit is beter:
PHP:
1
2
3
4
5
6
7
8
9
10
foreach ($fwoorden as $value) 
{
    $zoektocht = substr_count($bericht, $value);

    if ($zoektocht > 0) 
    {
        $resultaat_woord_check = true;
        break;
    } 
}


@hieronder: Dus. Ik gebruik nooit foreach O-)

[ Voor 30% gewijzigd door Mr. Bondt op 30-07-2006 16:51 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dat gaat ook niet werken. $key[$value] slaat nog op minder dan $value[$key]. Gewoon $value los, of $fwoorden[$key]. Ik zou die $key helemaal laten zitten, want direct met $value werken is veel makkelijker. $key => in de foreach kun je dan weghalen, omdat je die niet nodig hebt foreach ( $fwoorden as $value ) moet het dan worden, en dan $value gewoon los gebruiken. Wel een beetje erg basic dit hoor.

[ Voor 69% gewijzigd door Michali op 30-07-2006 16:49 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
@Mr. Bondt: klopt, ik zat met een multi dim tabel in gedachten :)

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Tweaqer
  • Registratie: November 2002
  • Laatst online: 14-07 20:43
Nou het werkt inmiddels als een tiet! :)

Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Is substr_count niet een beetje overkill? Als ik 500x een vies woord in een tekst zet, gaat substr_count ze alle 500 opzoeken en uittellen. Terwijl 1 voorkomen van zo'n woord al voldoende is. strpos is dus voldoende, alleen moet je wel kijken wat de return value daarvan is, wanneer een dergelijk woord gevonden is.

日本!🎌


Acties:
  • 0 Henk 'm!

  • Scott
  • Registratie: December 2004
  • Laatst online: 20-09 21:57

Scott

Ik ben, dus ik tweak

Is dit een niet nog makkelijkere manier dan ?

PHP:
1
2
3
4
5
6
7
8
9
10
11
$fwoorden = array();

$pattern = implode('|', $fwoorden);

if (preg_match('/('.$pattern.')/i', $bericht)) {

$resultaat_woord_check = true;

}

echo (isset($resultaat_woord_check)) ? 'Goed' : 'Fout';


Of is een regular expression hier 'not-done' ? :P

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

_Thanatos_ schreef op zondag 30 juli 2006 @ 22:29:
Is substr_count niet een beetje overkill? Als ik 500x een vies woord in een tekst zet, gaat substr_count ze alle 500 opzoeken en uittellen. Terwijl 1 voorkomen van zo'n woord al voldoende is. strpos is dus voldoende, alleen moet je wel kijken wat de return value daarvan is, wanneer een dergelijk woord gevonden is.
Ik zou eerder strstr() gebruiken.
PHP:
1
2
3
if (strstr($message, $vieswoord)) {
    echo 'geen vieze woorden gebruiken';
}

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
BalusC schreef op zondag 30 juli 2006 @ 23:00:
[...]

Ik zou eerder strstr() gebruiken.
PHP:
1
2
3
if (strstr($message, $vieswoord)) {
    echo 'geen vieze woorden gebruiken';
}
stristr() lijkt me beter, anders pakt 'ie TeRiNGLijER niet hè ;)

Acties:
  • 0 Henk 'm!

  • Oid
  • Registratie: November 2002
  • Niet online

Oid

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
function scheldwoorden($tekst) 
{
    //tekst uit elkaar halen
    $geschreven_tekst = explode(" ", $tekst);
    $qMGS = mysql_query("SELECT woord FROM mod_guestbook_scheldwoorden");

    $woorden = array();
    while($qMGSR = mysql_fetch_assoc($qMGS))
    {
        $woorden[] = $qMGSR['woord'];
    }

    // $woorden = array ("woord1","woord2","etc");
    // Aantal woorden tellen
    $aantal = count($woorden);
    $aantal_tekst = count($geschreven_tekst);
    // Array aflopen
    for ($woord=0;$woord<$aantal_tekst;$woord++)
    {
        for ($a=0;$a<$aantal;$a++)
        {
            if($woorden[$a] == $geschreven_tekst[$woord])
                return true;
            else
                return false;
        }
    }
}


PHP:
1
2
3
4
5
6
7
if( ( scheldwoorden($_POST['onderwerp'] ) ) 
                OR ( scheldwoorden($_POST['naam'] ) ) 
                OR ( scheldwoorden($_POST['email'] ) )
                OR ( scheldwoorden($_POST['locatie'] ) )
                OR ( scheldwoorden($_POST['bericht'] ) ))
            {
                echo "Uw bericht bevat niet toegestane woorden";



Ik heb dit, of het ook werkt op kleine letters en HOOFDLETTERS weet ik niet, gaat me meer om het beetje controle en als het dan maf word, gewoon verwijderen van bericht en Ban

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Sorry hoor, maar die code slaat nergens op. Ga die loop eens in gedachten doorlopen. Dan kom je er achter dan in de eerste iteratie van beide loops je gelijk een waarde returned. Oftewel, je loopt helemaal niet. Hoe dan ook, als je daar achter bent is het ook goed te bedenken dat dit behoorlijk inefficient is en je beter met stristr oid kan werken.

Noushka's Magnificent Dream | Unity

Pagina: 1