Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Cenzor
Forum PHP.pl > Forum > Przedszkole
majestiq
Mam taki prosty skrypt wyświetlający pozdrowienia na stronie:

  1. <?php
  2. (...)
  3. // odczyt pliku do tablicy
  4. $tekst = file("pozdrowienia.txt"); // odczytuje dane z pliku, nadac chmod 777
  5. $ile = 15; // ile linijek ma zapisywac do pliku (zero liczy sie tez jako linijka)
  6.  
  7. // zapisanie nowej linijki i starej zawartosci
  8. $plik = fopen("pozdrowienia.txt", "w");
  9. flock($plik, 2);
  10. fwrite($plik, "$_POST[pozd] r\n");
  11. for($i=0; $i < $ile; $i++) fwrite($plik, $tekst[$i]);
  12. flock($plik, 3);
  13. fclose($plik);
  14. setcookie ("sent", "sent", time()+60); //ustawia ciasto mowiace o tym, ze już wyslal pozdrowienia. 1=1 sekunda
  15. }
  16. else {
  17. $komunikat = 'Pozdrowienie musi mieć 5 - 40 znaków';
  18. } }
  19.  
  20. $tekst = file("pozdrowienia.txt"); // odczytuje dane z pliku, nadac chmod 777
  21. // zmienna $tekst[] to pozdrowienie, $gwiazdka to przerywnik miedzy pozdrowieniami
  22. $gwiazdka = '<span style="margin: 0 20px;">*</span>';
  23. $pozdrowienia = $gwiazdka . $tekst[0] . $gwiazdka . $tekst[1] . $gwiazdka . $tekst[2] . $gwiazdka . $tekst[3] . $gwiazdka . $tekst[4] . $gwiazdka . $tekst[5] . $gwiazdka . $tekst[6] . $gwiazdka . $tekst[7] . $gwiazdka;
  24. ?>



Jak najprościej zaimplementować tego cenzora:

  1. <?php
  2. function Cenzura($txt){
  3. $Bluzgi=array( 
  4. "/bluzg(a|i|asz)/i\",
  5. \"/dup(a|y|o|sko)/i\"
  6. );
  7. return preg_replace( $Bluzgi, '####', $txt );
  8. }
  9. ?>


Kiedy sprawdzalibyście czy słowa są ok - w tym skrypcie który pokazałam na początku - przy wpisywaniu pozdrowień przez użytkownika, czy dopiero podczas pobierania pozdrowień do wyświetlenia a może jeszcze w innym momencie ?

Czy w tym przypadku $txt w funkcji cenzora to $txt=pozdrowienia.txt questionmark.gif
webasek
Użył bym w tym miejscu

  1. <?php
  2. fwrite($plik, Cenzura($_POST[pozd])." r\n");
  3. ?>
golaod
webasek ma racje. Najlepiej, żeby to już od razu było zapisane w zmienionej postaci.
Btw. dodaj sobie też takie odmiany jak np /d(u|ó)p(a|y|o|sko|e.*)/i bo jednak pamiętaj, że można napisać h.. ch... ..uj ój itd, co jednak będzie miało znaczenie bo ludzię jednak są specjalistami w oszukiwaniu czegoś takiego (często własną głupotą i nie znajomością zasad pisowni). Dodałbym też jakieś sprawdzanie typu robienie spacji kropek itp. tzn po każdej literze zrobić coś takiego [^[:alnum:]]? czyli, że może wystąpić znak który nie jest ani cyfrą ani literą smile.gif
majestiq
No właśnie jest dużo sposobów na obejście, ale nie znam na tyle dobrze php, żeby wszystkie a nawet część tych możliwości wykluczyć :/
Może znacie chociaż jakąś bazę tego typu słów, najlepiej z odmianą bo pisać te wszystkie okropieństwa z pamięci to lekkie przegięcie winksmiley.jpg
golaod
Niestety nie znam, ale sądzisz, że ich aż tak dużo jest ? Pamiętaj, że nie musisz cenzorować złożonych, wystarczy, że uda Ci się sam core zatuszować i też będzie dobrze np. wych..ać to niech chociaż zniknie do tego wy####ać i będzie to udany sposób smile.gif
Szunaj85
Piszesz o cenzurowaniu, a dzień wcześniej użytkownik "Wredny" poruszał podobny problem. Tu masz dokładny adres: (http://forum.php.pl/PHPCenzura_t100243.html). W dodatku napisał on, że posiada bazę wulgaryzmów. Może udostępni Ci ją jak o nią poprosisz. Wtedy nie będziesz musiał pisać z pamięci. snitch.gif Moglibyście też połączyć siły żeby napisać w miarę dobrego cenzora. sekret.gif
golaod
Tylko, że jak właśnie zauważyłeś to wymaga konkretnej bazy plików. preg_match lub str_replace cokolwiek takiego...jest znacznie szybsze,wymaga mniej nakładu.
Poza tym warto by właśnie dodać jeszcze zależności takie jak poruszone w/w wątku (dzięki szunaj za link) czyli nie podsłuchuj. Oznacza to, że trzeba dodać jeszcze pewne zależności.
majestiq
Tamtego posta Wrednego nie zauważyłem, dzięki za linka .

"Tylko, że jak właśnie zauważyłeś to wymaga konkretnej bazy plików. preg_match lub str_replace cokolwiek takiego...jest znacznie szybsze,wymaga mniej nakładu."

No ale chyba preg_match lub str_replace musi wiedzieć jaką częśc ma zamienić na '#' i do tego potrzebna jest ta baza :-) ?!
golaod
Zrozum...Albo możesz mieć bazę liczącą np. 150 słów a odmian naprawdę jest CAŁY ogrom, albo zdefiniować core (np. tylko 5-10 wyrażeń) który będzie potrafił znaleźć wszystkie te słowa które normalnie ktoś by musiał spisać - a po co spisywać ?.
(TYLKO PRZYKŁADOWO)
chuj
chój
choi
chói
chui
hui
hooj
huuj
hooi
huui
(KONIEC PRZYKŁADU)
Do tego co podałem można jeszcze dodać prefixy i suffixy
czyli(też tylko przykład) ochujać czy wychujać
Więc po co się męczyć skoro można tylko napisać dobre wyrażenie regularne dla tego właśnie słowa ?
np. c?h(u|ó|o)+(j|i)+
w ten o to sposób już się nie martwisz się już czy ktoś napisze przez samo h czy ch, dodatkowo czy napisze u,ó czy o nawet po kilka razy i to samo się tyczy j oraz i. Wystarczy teraz dodać tylko obsługę prefixów i suffixów oraz np. fakt, że ktoś napisze c.h.u.j
majestiq
W sumie może i masz rację.

10-20 najpopularniejszych wulgaryzmów + reg ex może rzeczywiście będzie lepsze niż
baza 2000 słów.

Czyli dla każdego słowa osobna linijka w php...
Słowa w tablicy nic nie dadzą (bo wyrażenie regularne będzie dla każdego się różniło) ?!
golaod
preg_replace przyjmuje tablice. Zatem wyrażenia możesz zapisać w tablicy wstawić jako pierwszy parametr. Jako drugi podajesz tylko xxx czy tam coś.
majestiq
Czyli coś takiego:

  1. <?php
  2. $tekst = 'dupa';
  3. $Bluzgi=array( 
  4. "/bluzg(a|i|asz)/i\",
  5. \"/dup(a|y|o|sko)/i\"
  6. );
  7.  
  8. echo preg_replace( $Bluzgi, 'xxx', $tekst );
  9. ?>


Zresztą, to było już na początku :-)
A co znaczy: "/ przed 'bluzg' oraz po: /i\
i \"/ przed 'dup' questionmark.gif
golaod
Nie.
echo preg_replace($bluzgi,'xxxx',$tekst);
majestiq
Wiem, zauważyłem błąd, ale mnie uprzedziłeś :-)
golaod
Nie wiem skąd to wziąłeś powinno być:
"/bluzg(a|i|asz)/i",
"/dup(a|y|o|sko)/i"
I teraz / na początku i końcu oznacza, że jest to wyrażenie regularne które ma być jakoś tam sobie interpretowane, a 'i' oznacza że podczas przeszukiwania ma nie zwracać uwagi na wielkość liter.
majestiq
Ten kod skopiowałem z innego posta na podobny temat.

Zawsze myślałem, że wyrażenie regularne powinno zaczynać się od ^ a kończyć na $ a nie /,
ale rozumiem, że to nie tyczy się przypadku gdy interesujący nas string określany przez wyraźenie
znajduje się w dowolnym miejscu innego ciągu a nie np tylko na jego początku.
golaod
Tak właśnie.
^ oznacza, że od tego miejsca się string zaczyna,a kończy na $
majestiq
Dobra, dzięki wielkie za pomoc.
Może coś z tego będzie biggrin.gif

Kurde, coś nie działa mi to:

  1. <?php
  2. $tekst=file_get_contents('zmiennap.txt');
  3. $Bluzgi=array( 
  4. "/bluzg(a|i|asz)/i",
  5. "/dup(a|y|o|sko)/i",
  6. "/huj(a|i|e|u)/i"
  7. );
  8.  
  9. echo preg_replace( $Bluzgi, 'xxx', $tekst );
  10. ?>


W pobieranym tekście mam słowa, które powinny zostać zamienione (takie jak w $bluzgi), ale nic się nie podmienia :/
nospor
bo zapomniano o tym, ze literki z nawiasow mogą ale nie muszą wystąpić:
  1. <?php
  2. $Bluzgi=array( 
  3. "/bluzg(a|i|asz)?/i",
  4. "/dup(a|y|o|sko)?/i",
  5. "/huj(a|i|e|u)?/i"
  6. );
  7. ?>
majestiq
Dzięki kolego exclamation.gif!

A co dodać na początku:

  1. <?php
  2. "/bluzg(a|i|asz)?/i"
  3. ?>



żeby słowo 'zbluzgasz' też zostało zastąpione ?


  1. <?php
  2. "/z?bluzg(a|i|asz)?/i"
  3. ?>


coś mi nie działa :/

P.S. W ogóle po co jest / przed bluzg questionmark.gif
nospor
Cytat
"/z?bluzg(a|i|asz)?/i"
A mi dziala. Moze pokaz caly kod jak tego uzyles. Moze masz cos w tekscie innego niz myslisz.

Cytat
W ogóle po co jest / przed bluzg
Z tego samego powodu co jest przed i - /i - poczytaj o wyrazeniach regularnych w php to sie dowiesz
.radex
Cytat(majestiq @ 22.08.2008, 17:47:54 ) *
  1. <?php
  2. "/z?bluzg(a|i|asz)?/i"
  3. ?>


Wydaje mi się, że

/[z]?bluzg(a|i|asz)?/i

będzie ok

Cytat
P.S. W ogóle po co jest / przed bluzg questionmark.gif


Taki wymóg PCRE. Chodzi o to, aby oddzielić samo wyrażenie regularne od ewentualnych dodatkowych flag (np. w tym przypadku na końcu jest "i")

EDIT:

No i znów nospor był przede mną tongue.gif
majestiq
Sorki za posta, mały mistake smile.gif
Dzięki za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.