Lista zakazanych słów. Automatyczna cenzura.

0

Witam. Próbuję dzisiaj zaimplementować bota który będzie mi sprawdzał każdy wpis na moim blogu-forum, pod kątem obecności "niechcianych słów". W jaki sposób mogę to zrobić. Chciałbym wszystkie te słowa wrzucić do tablicy, a potem jakąś funkcją porównywać string ze słówkami z tej tablicy. Jeśli jakieś słówko się pojawi to automatycznie wyklucza publikacje postu + ładny komunikat się pojawi.

Dziękuję za pomoc przy doborze odpowiednich funkcji
Pozdrawiam serdecznie i walentynkowo
Jakub

0

Umiesz korzystać z wyszukiwarki? Po angielsku jak i po polsku jest pełno wyników, a z każdym pomysłem biegniesz na forum i chcesz gotowego rozwiązania. Jak sobie z czymś nie radzisz to pokaż kod i podpowiemy, ale myśleć za Ciebie nikt nie będzie.

1

regex i replace, nic więcej nie trzeba, algo na poziomie pierwszych dni z programowaniem

3

Poczytaj sobie o podstawach przetwarzania języka naturalnego. Stemming i lematyzacja + tokenizacja to zazwyczaj pierwsze tematy, a powinny wystarczyć do budowy takiego bota.

0
/\b(\w*work\w*)\b/i

i co wy na to? haha To teraz ta. Przydała by się jakaś fajna pętla i... czy ktoś ma listę wszelkich możliwych polskich bluzgów w tablicy bo mi się nie chce jej układać od nowa ;-).

Serdecznie dziękuję i pozdrawiam
Kuba

Jakbyście byli kolegami, bo byście to zrobili za mnie. Albo od razu podali linka do tego jak ktoś już coś takiego tutaj zrobił na tym forum ;-) ;-)

<?php
//tablica z bluzgami
$str = "String zawierajacy słowo aasdfstusieukrYŁ!haha";
$bluzgi = array("kurwa", "huj", "dupcyć", "pierdole");
$ile_bluzgow = count($bluzgi);
//pętla preg_match
for ($x = 0; $x <= $ile_bluzgow; $x++) {
    preg_match("/\b(\w*$bluzgi[$x]\w*)\b/i", $str, $matches);
        if(!empty($matches)){
            echo 'Znaleziono złe słowa: ';
            print_r($matches);
        }
} 
?>

Przepraszam, ale preg_match zawsze robi tablicę i ona nigdy nie jest empty.
Jak mam rozróżnić kiedy coś znalazł a kiedy nie?

Dziękuję serdecznie za pomoc!
Pozdrawiam
Kuba

0

"c***"

upewnij się, że nie ocenzuruje słów typu "podsłucc***e".

0
<?php
//tablica z bluzgami
$str = "String zawierajacy słowo aasdfsdupcyćtusieukrYŁ!haha"; // dużego Ć już nie łapie !!!
$bluzgi = array("kurwa", "huj", "dupcyć", "pierdole");
$ile_bluzgow = count($bluzgi);
//pętla preg_match
echo '<pre>Znaleziono złe słowo: ';
for ($x = 0; $x <= $ile_bluzgow; $x++) {
    preg_match("/\b(\w*$bluzgi[$x]\w*)\b/i", $str, $matches);
        if(!empty($matches)){
                echo $matches[0];
                // co się dzieje teraz?
                // jeśli znaleziono złe słowo
                // dajemy userowi możliwość poprawy
                // swojego wpisu na ładniejszy
                
                // KOD
                
                // &
                exit;
            }
        } // koniec pętli for z preg_matrz
// jeżeli preg_match nie znalazł żadnych brzydkich słów
// wpis jest gotowy do zapisu
?>
0

Tu jest przykład na realizację automatycznej cenzury, zamiany wulgarnych słów na znaki # albo *, konkretniej Text::censor
https://github.com/koseven/koseven/blob/master/system/classes/Kohana/Text.php

Można by porównywać same wejściowe i wyjściowe stringi, przy założeniu że normalnie nikt nie wpisuje ### albo *** no ale można by się bawić i z preg_match.

0

Przepraszam... co jest nie tak w tym kodzie?
Może coś na pierwszy rzut oka zobaczycie?
Dzięki za pomoc!

<?php
//tablica z bluzgami

$str = "String zawierajacy słowo aasdfsjebaŁduptushujieukrYŁ!haha";

$bluzgi = array("kurwa", "huj", "dupcyć", "dupcyĆ", "pierdole", "kurwo", "jebać", "jebaĆ", "pizdo", "pizda", "frajer", "frajerze", "buc", "bucu", "pojeb", "pojebie", "pierdolona", "pierdolony", "kurwy", "chuj", "chuju", "huju", "huje", "pokurw", "pokurwie", "ciota", "cioto", "szmato", "suka", "suko", "matole", "matoł", "fagas", "zerżnąć", "zerŻnĄĆ", "troll", "smarku", "wypierdalaj", "wypierdalać", "wypierdalaĆ", "dupa", "dupy", "wyrucham", "ruchać", "ruchaĆ", "jebał", "jebaŁ", "zabij", "smarku", "żyg", "Żyg");

$ile_bluzgow = count($bluzgi);

echo '<pre>Znaleziono ciąg zanków zawierający złe słowo: ';

//pętla FOR z preg_match
for ($x = 0; $x <= $ile_bluzgow; $x++) {
    preg_match("/\b(\w*$bluzgi[$x]\w*)\b/i", $str, $matches);
        if($matches[0] !== 'String') {
                echo $matches[0];
                // co się dzieje teraz?
                // jeśli znaleziono złe słowo
                // dajemy userowi możliwość poprawy
                // swojego wpilu na ładniejszy (KOD)
                
                
                
                // &
                exit;
            }
        } // koniec pętli FOR
// jeżeli preg_match nie znalazł żadnych brzydkich słów
// wpis jest gotowy do zapisu
?>

Bo mi przestał wynajdować... :-(

0
<?php
# Ponizej znajduja siê wyrazy okreslone jako 'obrazliwe' wiec je¶li
# nie chcesz - nie czytaj

$TXT = "Powiedziala cipa dupie<br>Nie bêdziemy zyli w kupie<br>bo Ty pierdzisz/podpierdujesz<br>interesy z chujem psujesz.<br>Na to cipa obrazona: \"O Ty cipo pierdolona - ciebie dupca tobie placa<br>a mnie bija chuj wie za co !\"";

         $tab_bluzgi=array("0"=>"chuj",
		                   "1"=>"chuju",
						   "2"=>"chujowe",
						   "3"=>"chujostwo",
						   "4"=>"chujnia",
						   "5"=>"chujowiny",
						   "6"=>"chuje",
						   "7"=>"chujach",
						   "8"=>"cipa",
						   "9"=>"cipo",
						   "10"=>"ciptok",
						   "11"=>"cipowisko",
						   "12"=>"ciptu¶",
						   "13"=>"ciptus",
						   "14"=>"pierdol",
						   "15"=>"pierdolony",
						   "16"=>"pierdolone",
						   "17"=>"pierdolona",
						   "18"=>"pierdoliæ",
						   "19"=>"pierdolic",
						   "20"=>"pierdol",
						   "21"=>"spierdalaj",
						   "22"=>"jebany",
						   "23"=>"jebana",
						   "24"=>"jebaæ",
						   "25"=>"jebac",
						   "26"=>"pojebany",
						   "27"=>"pojebana",
						   "28"=>"pojebane",
						   "29"=>"pojebaæ",
						   "30"=>"pojebac",
						   "31"=>"popierdolony",
						   "32"=>"popierdolone",
						   "33"=>"popierdolona",
						   "34"=>"popierdoliæ",
						   "35"=>"popierdolic",
						   "36"=>"popierdalaæ",
						   "37"=>"popierdalac",
						   "38"=>"spierdalaj",
						   "39"=>"spierdalaæ",
						   "40"=>"spierdalac",
						   "41"=>"spierdalanie",
						   "42"=>"zdupcaj",
						   "43"=>"zdupcanie",
						   "44"=>"wykurwiaj",
						   "45"=>"wkurwiaj",
						   "46"=>"wkurwiaæ",
						   "47"=>"wkurwiac",
						   "48"=>"hujowo",
						   "49"=>"pierdol",
						   "50"=>"kutas",
						   "51"=>"pizda",
						   "52"=>"hujek",
						   "53"=>"kutas",
						   "54"=>"skurwysyn",
						   "55"=>"skurwysynu",
						   "56"=>"skurwysynie",
						   "57"=>"kurwo",
						   "58"=>"kurwa",
						   "59"=>"kurwiæ",
						   "60"=>"kurwic",
						   "61"=>"kurwiac",
						   "62"=>"kurwiaæ",
						   "63"=>"wkurwiaj",
						   "64"=>"kurwiaj",
						   "65"=>"wykurwiaj",
						   "66"=>"wykurwiaj",
						   "68"=>"dupe",
						   "69"=>"szmata",
						   "70"=>"szmato"
						   # wisywac kolejne ale uwazac na klucz i wartosc ! (¿eby siê nie pomylic)
						   );
			function bluzgi($arg,$tab_bluzgi,$kolor="red",$rozmiar="13px",$format="verdana"){
			        
					 foreach($tab_bluzgi as $key=>$v):
					 if(stristr($arg,$v)):
					  $arg=str_replace($v,"<font style=\"font-family:$format; color:$kolor; font-size:$rozmiar\">*****</FONT>",$arg);
					 endif;
					 endforeach;
					 return $arg;
					  
			}
			echo "Tekst \"czysty\" (z wulgaryzmami)";
			echo '<br>'. $TXT. '<br><hr>';
			echo "Tekst \"wyczyszczony\" <br>";
			echo bluzgi($TXT,$tab_bluzgi);
?>
1
<?php
//tablica z bluzgami

$str = "String zawierajacy slowo chuj aasdfsjebaLduptushujieukrYL!haha";

$bluzgi = array("kurwa", "chuj", "dupcyc", "dupcyC", "pierdole", "kurwo", "jebac", "jebaC", "pizdo", "pizda", "frajer", "frajerze", "buc", "bucu", "pojeb", "pojebie", "pierdolona", "pierdolony", "kurwy", "chuj", "chuju", "huju", "huje", "pokurw", "pokurwie", "ciota", "cioto", "szmato", "suka", "suko", "matole", "matol", "fagas", "zerznac", "zerZnAC", "troll", "smarku", "wypierdalaj", "wypierdalac", "wypierdalaC", "dupa", "dupy", "wyrucham", "ruchac", "ruchaC", "jebal", "jebaL", "zabij", "smarku", "zyg", "Zyg");

$how_many = explode(' ', $str);

for($i=0; $i<count($how_many); $i++)
{
	
	if(in_array($how_many[$i], $bluzgi))
	{
		
		exit("Znaleziono brzydkie slowo.");
		
	}
	
}

print "Nie znaleziono brzydkich wyrazów";
?>
0

Kochasiu Poczekaj, poczekaj, poczekaj. ;-) ;-)

Bo ty tu korzystasz z funkcji in_array która nie zakłada opcji blablachujdupacipalalalaala. A ja robię preg_match. Tylko problem mam taki, że preg mach mi zawsze zwraca tablicę. Nawet jak nic nie znajdzie. A jak odpaliłem tą flagę PREG_UNMATCHED_AS_NULL to mi w ogóle przestało działać.

Tutaj jest potrzeba prawdziwie ekspercka porada.
Za którą z góry dziękuję i pozdrawiam.
Kuba

0
for ($x = 0; $x <= $ile_bluzgow; $x++) {
    preg_match("/\b(\w*$bluzgi[$x]\w*)\b/i", $str, $matches);
        if(!empty($matches)){
            echo 'Znaleziono złe słowa: ';
            print_r($matches);
        }
} 

To mi rozkmiń roszę. Jak obsłużyć preg_match.
Ale to jest tak skomplikowane że wymaga
wielu testów. No więc ja się już tym zajmuję.

Dzięki za pomoc.
Kuba

0

GOTOWY MECHANIZM KONTROLI BLUZGÓW W STRINGU! :-)

<?php

$str = "String zawierajacy słowo";

$bluzgi = array("kurwa", "huj", "dupcyć", "dupcyĆ", "pierdole", "kurwo", "jebać", "jebaĆ", "pizdo", "pizda", "frajer", "frajerze", "buc", "bucu", "pojeb", "pojebie", "pierdolona", "pierdolony", "kurwy", "chuj", "chuju", "huju", "huje", "pokurw", "pokurwie", "ciota", "cioto", "szmato", "suka", "suko", "matole", "matoł", "fagas", "zerżnąć", "zerŻnĄĆ", "troll", "smarku", "wypierdalaj", "wypierdalać", "wypierdalaĆ", "dupa", "dupy", "wyrucham", "ruchać", "ruchaĆ", "jebał", "jebaŁ", "zabij", "smarku", "żyg", "Żyg", "chuj", "chuju", "chujowe", "chujostwo", "chujnia", "chujowiny", "chuje", "chujach", "chujasz", "cipa", "cipo", "ciptok", "cipowisko", "ciptu¶", "ciptus", "pierdol", "pierdolony", "pierdolone", "pierdolona", "pierdoliæ", "pierdolic", "pierdol", "spierdalaj", "jebany", "jebana", "jebaæ", "jebac", "pojebany", "pojebana", "pojebane", "pojebaæ", "pojebac", "popierdolony", "popierdolone", "popierdolona", "popierdoliæ", "popierdolic", "popierdalaæ", "popierdalac", "spierdalaj", "spierdalaæ", "spierdalac", "spierdalanie", "zdupcaj", "zdupcanie", "wykurwiaj", "wkurwiaj", "wkurwiaæ", "wkurwiac", "hujowo", "pierdol", "kutas", "pizda", "hujek", "kutas", "skurwysyn", "skurwysynu", "skurwysynie", "kurwo", "kurwa", "kurwiæ", "kurwic", "kurwiac", "kurwiaæ", "wkurwiaj", "kurwiaj", "wykurwiaj", "dupe", "szmata", "szmato");

$ile_bluzgow = count($bluzgi);

echo '<pre>Znaleziono ciąg zanków zawierający złe Xsłowo: <br><br>';

for ($x = 0; $x <= $ile_bluzgow; $x++) {
    
    preg_match("/\b(\w*$bluzgi[$x]\w*)\b/i", $str, $matches);
    
        if($matches[0]){

                echo $matches[0].'<br>';
                
                    $handle = $handle + count($matches[0]);
                
                             // TO SĄ JAKIEŚ JAJA CO JA TU MUSIAŁEM ZROBIĆ ŻEBY TO ZADZIAŁAŁO
    
            }
        } 
        
if ($handle == 1){
    
    echo 'Nie ma żadnych bluzgów!';
    
}else{
    
    echo 'Znaleziono jakieś bluzgi!';
    
}
?>

bardzo ważna sprawa... w jakim kodowaniu jest ta lista i
z jakiego kodowania wysyłamy $_POSTa bo jeśli lista nie
jest w UTF-8, a ty będziesz miał forma w UTF-8 to lipa!

Człowiek się uczy na błędach. Po to są.
Programowanie to bardzo indywidualna przygodna.
Pozdrawiam.
Kuba

1

Tak dla ćwiczeń, na bazie Text::censor z Kohany/Koseven, w celu wyszukiwania podejrzanych słów, również ze sprawdzaniem czy nie są tylko częścią innych słów. Zwraca tablicę znalezionych słów.

<?php

$badwords = array('chuj', 'dupa', 'kurwa');

function find_badwords($str, $badwords, $partial_words = false)
{
    foreach ($badwords as $key => $badword)
    {
        $badwords[$key] = str_replace('\*', '\S*?', preg_quote($badword));
    }

    $regex = '('.implode('|', $badwords).')';
    if ($partial_words === false)
    {
        $regex = '(?<=\b|\s|^)'.$regex.'(?=\b|\s|$)';
    }
    $regex = '!'.$regex.'!ui';

    preg_match_all($regex, $str, $matches);
    return isset($matches[0]) ? $matches[0] : array();
}

$clean_text = 'To jest tekst bez słów wulgarnych';
$bad_text1 = 'To jest tekst ze słowami chuj, dupa oraz kurwa';
$bad_text2 = 'To jest tekst ze słowami chuj, tojestdupa oraz kurwaaaaa';

$words1 = find_badwords($clean_text, $badwords, false);
$words2 = find_badwords($clean_text, $badwords, true);
$words3 = find_badwords($bad_text1, $badwords, false);
$words4 = find_badwords($bad_text1, $badwords, true);
$words5 = find_badwords($bad_text2, $badwords, false);
$words6 = find_badwords($bad_text2, $badwords, true);

print_r($words1);
print_r($words2);
print_r($words3);
print_r($words4);
print_r($words5);
print_r($words6);

Wynik:

Array
(
)
Array
(
)
Array
(
    [0] => chuj
    [1] => dupa
    [2] => kurwa
)
Array
(
    [0] => chuj
    [1] => dupa
    [2] => kurwa
)
Array
(
    [0] => chuj
)
Array
(
    [0] => chuj
    [1] => dupa
    [2] => kurwa
)
0
mr_jaro napisał(a):

http://marcinmazurek.com.pl/polskie-wulgaryzmy

\b(\w*cipę\w*)\b

i dochodzimy do sedna problemu w moim przypadku, czyli do polskich znaków w regex
czy ktoś coś wie na ten temat?

dziękuję za odpowiedź
Pozdrawiam
Kuba

1

W kodzie wyżej masz:

preg_match("/\b(\w*$bluzgi[$x]\w*)\b/i", $str, $matches);

a modyfikacja czyli na końcu ui zamiast i jako modyfikator by rozwiązywało sprawę z polskimi znakami, pod warunkiem że masz UTF-8

preg_match("/\b(\w*$bluzgi[$x]\w*)\b/ui", $str, $matches)

https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

0

... pod warunkiem że masz UTF-8

a jak ja mam to deklarować?
gdzieś przed FORMem skąd wysyam POSTa?

dziękuję za odpowiedź
Pozdrawiam
Kuba

0

W HTML-u sprawdź czy masz:

<meta charset="utf-8"/>

No i to:

<form action="/costam" accept-charset="UTF-8">

1 użytkowników online, w tym zalogowanych: 0, gości: 1