Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: cenzura inaczej...
Forum PHP.pl > Forum > PHP
neverever
Napisałem sobie skrypt cenzurujący, który gwiazdkuje pasujące do wzoru wyrazy.
W skrócie ma on mniejwięcej taką postać:
  1. <?
  2. $slowo = array(
  3. "/(w|wy|za)*kurw(o|y|a|ić|iać|ać|iony|iona|ione|ieni)*/i",
  4. "/kuta(s|sa|sy|fon|fony|fonów)+/i",
  5. "/(u|wy|za|prze|przy|pod)*dup(a|y|as|ić|ny|ne|ną|iony|ione|ioną|ionego|ionych|sko|skiem|cia|cie|czyć|eczk
    a
  6. eczki|encja|czyć|odajka)*/i",
  7. "/dziw(ka|ki|ką|kę|kom|ce|eczka|eczce|eczką|eczkę|eczkom)+/i"
  8. );
  9.  
  10.  
  11. $wynik = preg_replace( $slowo, ' *** ', $tekst );
  12. echo $wynik;
  13. ?>


Pytanie brzmi: Jak najlepiej przerobić ten kod, żeby otrzymać funkcję która nie będzie modyfikowała wprowadzonego tekstu a wykrywała tylko obecność zakazanych słów i zwracała w takim przypadku true, lub false gdy tekst jest czysty?

Czy najlepiej będzie użyć eregi w pętli, czy też może coś innego??

I jeszcze jedno pytanie - Czy powyższe reguły można jeszcze bardziej uprościć?
Czy można zagnieżdżać warunki w regułach??

tj. np. zamiast:
  1. <?php
  2. "/(u|wy|za|prze|przy|pod)*dup(a|y|as|ić|ny|ne|ną|iony|ione|ioną|ionego|ionych|sko|skiem|cia|cie|czyć|eczk
    a
  3. eczki|encja|czyć|odajka)*/i"
  4. ?>


coś w stylu:
  1. <?php
  2. "/(u|wy|za|prz(e|y)|pod)*dup(a|y|as|ić|n(y|e|ą)|ion(y|e|ą|ego|ych)|sk(o|iem)|ci(a|e)|czyć|eczk(a|i)|encja|czyć|odajka)*/i"
  3. ?>


questionmark.gif
xbigos
http://pl.php.net/in_array
neverever
Cytat(xbigos @ 17.04.2008, 12:02:49 ) *

Hmm... in_array ?

Ale czy da się to in_array jakoś rozsądnie połączyć z tymi wyrażeniami regularnymi?? -bo jakoś nie mam na to pomysłu :-/

No i nadal bez odpowiedzi pozostaje moje drugie pytanie, czy taki "zagnieżdżony" zapis wyrażenia regularnego jest poprawny
...ewentualnie jak uprościć moje wyrażenia?
ayeo
preg_match();



preg_match_all();
neverever
Cytat(ayeo @ 17.04.2008, 12:27:31 ) *
preg_match();
preg_match_all();

Może się myle, ale te funkcje na wejściu przyjmują chyba tylko parametry typu string a zwracają wynik w postaci tablicy
...czyli musiałbym i tak w pętli im zapodawać kolejno moje reguły i każdorazowo sprawdzać czy coś znalazły czy nie.

No ale może się myle?
ayeo
Wystarczy sprawdzić czy preg_match nie zwróciło 0. Jeżeli nie to znaczy, że tekst zawiera wyrażenie w sobie. Pozdrawiam!
neverever
Cytat(ayeo @ 17.04.2008, 12:43:32 ) *
Wystarczy sprawdzić czy preg_match nie zwróciło 0. Jeżeli nie to znaczy, że tekst zawiera wyrażenie w sobie. Pozdrawiam!
Czyli:
  1. <?php
  2. function sprawdz($slowo,$txt){
  3. $wynik=false;
  4. for($i=0;$i<count($slowo);$i++)
  5. if(preg_match($slowo[$i], $txt, $tab)!=0){ $wynik=true; break;}
  6. return $wynik;
  7. }
  8.  
  9. if(sprawdz($slowo,$txt)==true) echo 'znalazłem!!!'; else echo 'czysto';
  10. ?>


gdzie $slowo -to moja tablica z regułami, a $txt -to tekst do sprawdzenia.

Czy tak?
ayeo
Ja bym zrobił to tak:

  1. <?php
  2. function check($text, $patterns)
  3. {
  4. foreach ($patterns as $pattern)
  5. {
  6. if(preg_match($pattern, $text) != 0) return true;
  7. }
  8. return false;
  9. }
  10. ?>



w sumie tablicę z wyrażeniami można dać na sztywno w funkcji. I używać jej w banalny sposób:
  1. <?php
  2. function check($text)
  3. {
  4. $patterns = array(
  5.  "/(w|wy|za)*kurw(o|y|a|ić|iać|ać|iony|iona|ione|ieni)*/i",
  6.  "/kuta(s|sa|sy|fon|fony|fonów)+/i",
  7.  "/dziw(ka|ki|k|kę|kom|ce|eczka|eczce|eczką|eczkę|eczkom)+/i"
  8. );
  9. foreach ($patterns as $pattern)
  10. {
  11. if(preg_match($pattern, $text) != 0) return true;
  12. }
  13. return false;
  14. }
  15.  
  16. $text = "Co ja mam to napisać? Może dupa?";
  17.  
  18. echo check($text) ? "Znalazłem przekleństwa" : "Nie znalazłem!";
  19. ?>
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.