Scheldwoorden filter (met Mysql en PHP)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark van den Brink

Mark van den Brink

27/09/2012 20:07:40
Quote Anchor link
Beste php liefhebbers,

Ik zit met een vraag ik wil op mijn blog berichten een scheldwoorden filter zetten zoals dit.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$bericht=str_replace("Kat","***", $rij["Bericht"]);
    $bericht=str_replace("KAT","***", $rij["Bericht"]);
    $bericht=str_replace("kat","***", $rij["Bericht"]);


Nu zien jullie al ik moet het woordje kat 3x uitwerken op drie verschillende manieren en eigenlijk nog zelfs meer!

Heeft iemand een script dit dit met het toevoegen van 1 woord meteen alle soorten en maten kut eruit haalt zonder dat ik 10 rijen str_replace heb?

En dan eigenlijk een andere vraag ik wil dat hij deze scheldwoorden uit een database haalt zodat ik die online kan laten toevoegen.

nu kreeg ik van iemand dit scriptje
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
if ($scheldwoordenfilter == "ja") {



$scheld_query = mysql_query("SELECT * FROM `scheldfilter` ORDER BY `id`");



while($scheldrecord = mysql_fetch_assoc($scheld_query))

{



$hetscheldwoord = $scheldrecord['scheldwoord'];

$devervanging = $scheldrecord['vervanging'];



$bericht = str_replace('{$hetscheldwoord}', '{$devervanging}', $bericht);



$afzender = str_replace('{$hetscheldwoord}', '{$devervanging}', $afzender);



}



}


Nou werkt dit script niet maar hebben jullie wel een idee hoe ik het zou willen hebben.

Nou is het de bedoeling dat hij in dit scriptje komt
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
<?php                        
$sql
  = "SELECT * FROM Reacties ORDER BY Datum DESC, Tijd DESC";
$resultaat = mysql_query($sql) or die(mysql_error());
echo '<table width="430" border="0" align="center" cellpadding="0" cellspacing="0">';
while ($rij = mysql_fetch_assoc($resultaat)) {
        

  echo '<tr>
    <td width="60" rowspan="2"><img src="'
;
    echo $afb;
    echo '" width="60" height="60" /></td>
    <td width="12">&nbsp;</td>
    <td width="208" class="chattekst">Door: <a href="mailto:'
;
    echo $rij["Email"];
    echo '" class="chattekst">';
    echo $rij["Naam"];;
    echo '</a></td>
    <td width="150" class="chattekst">'
;
    echo strftime('%d/%m/%Y', strtotime ($rij["Datum"]));
    echo ' om ';
    echo $rij["Tijd"];    
    echo '</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td colspan="2" class="chatbericht">'
;
    echo nl2br($rij["Bericht"];);
    echo '</td>
  </tr>
    <tr>
    <td colspan="4"><hr></td>
  </tr>'
;

}

    echo "\n";
    echo '</table>';
    ?>


Of is het misschien beter om deze filter te doen voordat hij in de database word gezet.


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
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
65
66
<?
$userErrors
= Array();

if(isset($_POST['posten'])){
    

    if( !isset($_POST['Naam']) || $_POST['Naam'] == '' )
    {

        
        $userErrors[] = 'U heeft geen naam ingevuld';
    }

    if( !isset($_POST['Email']) || $_POST['Email'] == '' )
    {

        
        $userErrors[] = 'U heeft e-mailadres ingevuld';
    }

    if( !isset($_POST['Bericht']) || $_POST['Bericht'] == '' )
    {

        
        $userErrors[] = 'U heeft bericht ingevuld';
    }


    if( count($userErrors) == 0 )
    {

        
        $iQuery = "INSERT INTO Reacties    (Naam, Email, Bericht, Datum, Tijd, IP) VALUES ('".mysql_real_escape_string(ucfirst(trim($_POST['Naam'])))."',
                    '"
.mysql_real_escape_string($_POST['Email'])."', '".mysql_real_escape_string($_POST['Bericht'])."', CURDATE(), NOW(), '".$_SERVER['REMOTE_ADDR']."')";

        $result = mysql_query($iQuery, $sqlLink);

        if( $iQuery === false )
        {

            
            SQLerror(mysql_error(), 'Uw bericht is niet verstuurd!', __FILE__);
        }

        else
        {
            if( mysql_affected_rows($sqlLink) > 0 )
            {

                $resultMessage = 'Uw bericht is succesvol verstuurd! U hoort zo snel mogelijk van ons!';
            $msg = "Geachte Webmaster,<br><br>";
            $msg .= "<b>".$_POST['Naam']."</b> heeft een bericht achter gelaten op uw site!<br><br>";
            $msg .= "Het volgende bericht heeft hij achtergelaten op de website:<br>";
            $msg .= "<b>".nl2br($_POST['Bericht'])."</b><br><br>";
            $msg .= "Wilt u deze persoon terug antwoorden <a href=http://www.marksdomein.nl>klik hier!</a><br>";
            $msg .= "of stuur hem een mailtje op: <b><a href=mailto:".$_POST['Email'].">".$_POST['Email']."</a></b><br><br><br>";
            
            $msg .= "<b><u>Overige gegevens:</u></b><br>";
            $msg .= "Datum: " . date("d.m.Y") . "<br>";
            $msg .= "Tijd: " . date("H:i") . "<br>";
            $msg .= "Ip addr: " . $_SERVER['REMOTE_ADDR'] . "<br><br>";
            
            $msg .= "Met vriendelijke groeten,<br><br>Webmaster Mark (SonicGFX)";

            
            mail($to, $subject, $msg, $headers);
            }

            else
            {
                $userError[] = 'Het opslaan is niet gelukt, probeer het later nog eens.';
            }
        }
    }
}


?>


Kan iemand mij vertellen hoe ik dit het beste kan implementeren in mij script? Om dit voor elkaar te krijgen?

Alvast bedankt,
Gewijzigd op 27/09/2012 22:11:23 door Mark van den Brink
 
PHP hulp

PHP hulp

11/05/2021 15:54:44
 
Frank WD

Frank WD

27/09/2012 20:34:38
Quote Anchor link
Ik heb niet 1 2 3 een antwoord op jou vraag.
Wel misschien een idee.

Zou je in de database niet beter een table "scheldwoorden" kunnen aanmaken.
Vervolgens waar je het zelf wens deze op de berichten laten controleren.
Het controleren zou ik dan doen op het moment je het toont op de site. Zo hou je de orginele data in takt. Ook een voordeel is dat je dan de scheldwoorden bewerkbaar houd en niet in de code hoeft te duiken als je het systeem ergens anders wilt gebruiken waar de woorden wel mogen.

Is dit misschien een na denk punt voor je?
Gewijzigd op 27/09/2012 20:35:57 door Frank WD
 
Jurgen B

Jurgen B

27/09/2012 20:41:49
Quote Anchor link
Om de hoofdletter/kleine letter varianten in 1 keer te checken kan je natuurlijk gewoon strtolower() doen op je bericht ;)
 
John D

John D

27/09/2012 20:42:21
Quote Anchor link
verder is het zo dat wanneer je een scheldwoordentabel hebt je simpel alle scheldwoorden erin kan zetten en toe kan voegen, qua MySQL data heeft dat geen enorme impact. Misschien is het zinvol om bij de check (lookup) altijd de input te lower-casen en in de tabel altijd alles lower case te houden want anders moet je in het geval van jouw voorbeeld ook KuT KUt kuT enzovoort aftesten want dit gaan men echt proberen.
Edit:
Toevoeging: Het geleverde script is heel slecht want dat haalt ALLE scheldwoorden op en gaat in php zitten processen of het scheldwoord in de arry zit. Knoeiwerk. De query moet bijvoorbeeld zijn:
$scheld_query = mysql_query("SELECT * FROM scheldfilter where scheldwoord = $te_testen_scheldwoord");
Gewijzigd op 27/09/2012 20:46:07 door John D
 
Jaron T

Jaron T

27/09/2012 21:18:52
Quote Anchor link
str_ireplace(array("kut", "lul"), "***", $row['bericht']);

je kan dus meerdere woorden tegelijk doen om in de 1e paramater een array te stoppen en str_ireplace gebruiken voor case insensitive .
Gewijzigd op 27/09/2012 21:19:08 door Jaron T
 
Frank WD

Frank WD

27/09/2012 21:23:57
Quote Anchor link
Off-topic:

Misschien is het verstandig om hier op het forum de scheldwoorden ook beetje te maskeren. Voorbeeld: k*t, l*l. Dit lijkt me wat netter staan op het forum, maar ook beetje uit respect voor andere forum gebruikers en lezers.
 
Obelix Idefix

Obelix Idefix

27/09/2012 21:49:59
Quote Anchor link
Goede opmerking van Frank. Maar denk dat je daarmee ook gelijk een aandachtspunt aanhaalt voor TS. Ga je ook controleren op 'woorden' als k*t, k#t, etc.?
 
Mark van den Brink

Mark van den Brink

27/09/2012 22:10:11
Quote Anchor link
Kijk een hoop reactie's allemaal.

@Frank: Momenteel heb ik ook in me MySQL een Tabel met scheldwoorden zitten maar ik weet niet precies hoe ik met een mooie script die scheldwoorden uit een database haal en die netjes in een array zet.
Zoals Jaron T zegt, wat overigens prima werkt op de manier hoe hij het zegt
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
str_ireplace(array("kat", "hond"), "***", $row['bericht']);
nu is alleen dus mijn vraag hoe kan ik die mooie array maken vanuit een database?

@Jaron T: Bedankt je case insensitive werkt inderdaad perfect en met 1 woord maskeer je meteen alle worden top!

@John D: Jou scriptje snap ik niet helemaal omdat je de WHERE clause niet kan gebruiken omdat hij een heel bericht moet doorzoeken en niet enkel 1 woord?

Off-topic: Ben ik helemaal eens met Frank en aangezien dit nog niet in de site zit wijzig ik mijn posts om het zelf netjes te houden vanaf nu spreek ik over kat en hond!

Toevoeging op 27/09/2012 23:01:17:

Aan iedereen het is me gelukt wat ik wilde met O.A. een andere topic hier op de site: http://www.phphulp.nl/php/forum/topic/scheldwoorden-filter/67637/

En die een beetje aangepast met de boilerplate van Wouter...Ik hoop dat ik het goed gedaan heb hij werkt in ieder geval.

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
<?php
$filter
= "SELECT * FROM Scheldwoordenfilter";
            
if ( $result = mysql_query( $filter )) {
    if( $result === false )
        {

            SQLerror(mysql_error(), 'Uw scheldwoordenfilter is niet geactiveerd', __FILE__);
        }

        else
        {
            if( mysql_num_rows($result) > 0 ) {
    $scheldwoorden = array();
    $vervang       = array();
    
    while ( $row = mysql_fetch_array( $result )) {
        $scheldwoorden[] = $row['Scheldwoord'];
        $vervang[]       = $row['Vervang'];
          }
    }

    else
    {
              $userError[] = 'Uw scheldwoordenfilter heeft niks vervangen';
            }            
    }
}

        
$bericht = str_ireplace( $scheldwoorden, $vervang, $rij['Bericht']);
?>


Super bedankt allemaal!
Gewijzigd op 27/09/2012 23:01:49 door Mark van den Brink
 
Frank WD

Frank WD

27/09/2012 23:40:24
Quote Anchor link
Zo op het oog ziet het er aardig uit.
Maar heb toch 1 vraagje die mij gelijk opvalt.

Ik zie dat je de woorden vervangt door iets uit de database.
Ik neem aan dat je toch gewoon al die woorden omzet naar ***.
Of heb je voor alle woorden een aparte vervang woord?

Als je het doet met *** kun je dan niet beter dit uit de database te laten?
Want dat scheelt je weer iets werken in mysql.
 
Mark van den Brink

Mark van den Brink

28/09/2012 18:42:50
Quote Anchor link
Klopt inderdaad zit ik nog over te twijfelen als iemand bijv: hond stuurt dat er **** en kat *** en kippen ****** als je begrijpt wat ik bedoel.

Maar misschien doe ik inderdaad gewoon **** of een waarschuwing
 
Martijn Wieringa

Martijn Wieringa

28/09/2012 21:36:02
Quote Anchor link
Het lijk mij niet wenselijk dat je midden in een woord een paar letters zou gaan vervangen. Dus zul je mogelijk eerst alle hele woorden uit je zinnen moeten filteren, en ze vervolgens een voor een moeten testen of het volledige woord matched met een van je vloekwoorden. Iets als dit (niet getest)

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php

    $sText
= 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque massa enim, fermentum iaculis posuere id, suscipit eu mauris. Mauris eu lectus massa. Praesent consequat molestie fermentum. Suspendisse leo mi, pulvinar ac iaculis id, lacinia non lacus. Nulla tristique ligula non metus vestibulum vestibulum venenatis dui convallis. Aliquam ut metus sed nisl pretium scelerisque quis et dolor. Morbi elementum sodales mauris ac tristique.

Curabitur pulvinar blandit orci eu rutrum. Pellentesque ornare augue eu erat condimentum interdum. Etiam mollis iaculis metus, sed placerat odio fermentum quis. Phasellus nulla quam, placerat sit amet rhoncus eu, semper et purus. Praesent quis neque mi, mattis bibendum leo. Nam quis nibh sit amet nunc venenatis lacinia ac et tortor. Integer volutpat hendrerit pellentesque. Quisque nec augue ut purus iaculis vulputate. In hac habitasse platea dictumst. Quisque quis dolor est, tincidunt adipiscing nibh.

Fusce neque purus, congue ut vestibulum quis, faucibus ut orci. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse eu eros ut turpis rutrum vulputate. Vestibulum facilisis diam et metus sagittis nec placerat lorem luctus. Duis vitae odio nec odio suscipit dignissim. Integer dignissim, purus eget aliquam commodo, orci dolor venenatis lacus, eget laoreet velit massa nec risus. Aenean arcu eros, laoreet ut varius ac, ultricies eu diam. Nunc fermentum neque non lectus mattis ullamcorper. Nam porta, ante sit amet hendrerit tristique, lacus risus lobortis urna, vitae aliquam ipsum odio eget ante. Nullam eleifend, sapien sit amet vehicula pharetra, lectus est venenatis dolor, in varius orci eros in libero. Donec at metus at odio viverra mattis quis nec augue.

Aliquam adipiscing convallis nibh et fringilla. Integer vestibulum mi eget leo posuere lobortis non eu nunc. Cras enim odio, aliquam id dignissim id, laoreet blandit lectus. In hac habitasse platea dictumst. Nulla facilisi. Maecenas tempor sem in ante ultrices tristique. Proin ornare, dolor a imperdiet interdum, enim nunc accumsan sapien, hendrerit mattis felis lorem ac massa. Ut et turpis sit amet enim luctus suscipit a sit amet nunc. Aenean bibendum dictum iaculis. Ut tortor metus, tincidunt vitae fringilla sed, molestie vitae lacus. Mauris et nulla massa, at cursus enim. Vivamus non aliquam justo. Aenean et metus id erat commodo ornare. Donec eu tempor lectus.

Nunc non ligula turpis. Sed tempor ullamcorper nisi, quis auctor turpis accumsan id. Donec non orci at est bibendum dictum non ac eros. Nam vitae nisi at ipsum congue blandit. Cras semper luctus sem a elementum. Nunc consequat sem sed ante aliquet at porta lorem dictum. Maecenas vel turpis elit. Donec pellentesque neque ac neque faucibus a commodo sem pretium. Donec in justo in tellus malesuada tempus. Phasellus lectus purus, laoreet mattis dignissim non, tempor ut ante. Vivamus sagittis, felis id mattis porta, magna magna egestas quam, nec molestie arcu nisl vitae urna. Donec id urna vitae libero vehicula pretium. Quisque in dolor vitae eros posuere fringilla. In eget ipsum id massa tempus ornare. Vestibulum justo nisl, molestie sit amet placerat ut, facilisis vitae nisl. Phasellus dictum enim ut ipsum sollicitudin interdum.'
;


    $aCurseWords = array('lorem', 'cum', 'et', 'orci');


    echo maskWords($sText, $aCurseWords);


    function
maskWords($sData, $aCurseWords)
    {

        $sResult = '';
        $aMatches = array();

        // Find all words
        preg_match_all('/([a-zA-Z]+)/', $sData, $aMatches, PREG_OFFSET_CAPTURE);

        foreach($aMatches[0] as $sMatch)
        {

            $bFound = false;

            foreach($aCurseWords as $sCurseWord)
            {

                if(strcasecmp($sCurseWord, $sMatch) === 0)
                {

                    $bFound = true;
                    break;
                }
            }



            if($bFound)
            {

                $sResult .= str_repeat('*', strlen($sMatch));
            }

            else
            {
                $sResult .= $sMatch;
            }
        }


        return $sResult;
    }


?>
Gewijzigd op 28/09/2012 21:38:21 door Martijn Wieringa
 
Mark van den Brink

Mark van den Brink

28/09/2012 22:26:20
Quote Anchor link
@martijn: Heb hem niet getest die van jou welke ik nu gebruik werkt eigenlijk het zelfde hij zoekt in mijn database alle scheldwoorden op en kijkt of hij die kan vinden in het bericht en deze maskeert hij dan.

Het gaat altijd om hele woorden dus hij zal nooit alleen een paar letters vervangen zoals bijv kk is een scheld woord maar deze kan ik natuurlijk niet vervangen anders kan lekker ook niet. en zoals jij het volgens mij aangeeft wil je alle woorden 1 voor 1 checken en kijken of hij gelijk is aan echter is daar weer zo bij dat als iemand hond zegt dat maskeert hij die maar als er dan hondsdol staat maskeert hij hem dan ook?
 



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.