Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> cenzura inaczej...
neverever
post
Post #1





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

Ostrzeżenie: (10%)
X----


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

Ten post edytował neverever 17.04.2008, 12:07:56


--------------------
neverever
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
xbigos
post
Post #2





Grupa: Zarejestrowani
Postów: 239
Pomógł: 27
Dołączył: 13.07.2005
Skąd: Jarocin

Ostrzeżenie: (0%)
-----


http://pl.php.net/in_array


--------------------
Go to the top of the page
+Quote Post
neverever
post
Post #3





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

Ostrzeżenie: (10%)
X----


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?


--------------------
neverever
Go to the top of the page
+Quote Post
ayeo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

Ostrzeżenie: (0%)
-----


preg_match();



preg_match_all();


--------------------
Go to the top of the page
+Quote Post
neverever
post
Post #5





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

Ostrzeżenie: (10%)
X----


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?


--------------------
neverever
Go to the top of the page
+Quote Post
ayeo
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

Ostrzeżenie: (0%)
-----


Wystarczy sprawdzić czy preg_match nie zwróciło 0. Jeżeli nie to znaczy, że tekst zawiera wyrażenie w sobie. Pozdrawiam!


--------------------
Go to the top of the page
+Quote Post
neverever
post
Post #7





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

Ostrzeżenie: (10%)
X----


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?

Ten post edytował neverever 17.04.2008, 12:07:29


--------------------
neverever
Go to the top of the page
+Quote Post
ayeo
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował ayeo 17.04.2008, 12:33:18


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 10:06