Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Skrypt usuwający wulgaryzmy Problem
ppietras86
post
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 19.01.2010

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


]witam
Pobralem sobie z sieci skrypt w PHP usuwający wulgaryzmy z tekstu "oczywiście przeklenstwa zamieniam na inne slowa"
  1. function badwords($message) {
  2. $badwords = array("ala","ola","ela","ula");
  3. foreach($badwords as $badword) {
  4. $stars = str_repeat("*", strlen($badword));
  5. $message = str_replace($badword, $stars, $message);
  6. }
  7. return $message;
  8. }


w takiej formie skrypt działa świetnie i wstawia w miejsce przekleństwa (naprzykład ala (IMG:style_emoticons/default/smile.gif) ) ) gwiazdki. Jednak ja chciałbym baze powiekszyć i załadować plik wulgaryzmy.txt do tablicy
link do pliku: uzylem kodowania iso. http://www.php-fusion.pl/forum/viewthread....;getfile=104605

skrypt poprawiony
  1. function badwords($message) {
  2. $badwords = file("wulgaryzmy.txt");
  3. foreach($badwords as $badword) {
  4. $stars = str_repeat("*", strlen($badword));
  5. $message = str_replace($badword, $stars, $message);
  6. }
  7. return $message;
  8. }


No i po zaladowaniu pliku do tablicy skrypt nie dziala - nie sprawdza wyrazów i po 2 godzinach patrzenia co mogloby sie dział zgłupiałem i nie wiem. Plika mam zaladowany do tabliy poprawnie bo sprawdzalem.
Pomóżcie

P.S. Pewnie to jakaś błachostka przeszkadza ale niestety nie wiem w którym miejscu.

Ten post edytował ppietras86 16.03.2010, 00:15:35
Go to the top of the page
+Quote Post
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Najprawdopodobniej jednak z ta tablicą jest coś nie tak. Pokaż może co wyświetla var_dump( $badwords ) w drugim przypadku, już po zmianach. Bo jeśli tam się przy konwersji do tablicy krzaczy, a na to wygląda, to jedynie poprawna konwersja do tablicy pomoże.
Inna sprawa to możliwy problem z kodowaniem... Funkcje z str_ w nazwie działają domyślnie z charsetem latin1, więc jeśli pchniesz tam utf-8 to przy polskich literach będziesz miał problem.
Go to the top of the page
+Quote Post
ppietras86
post
Post #3





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 19.01.2010

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


Dzięki za tą funkcje. Nie znałem jej.
Nie ma krzaków ale zauważyłem co innego (IMG:style_emoticons/default/smile.gif) )

Wyświetla mi na przykład.

[0]=> string(4) "ala "
czyli kładzie tam spacje na sam koniec i juz wiem czemu mi nie chce z niczym porównać. Ale jak teraz tej spacji sie pozbyć? jak załadować ten plik bez spacji?

z tego co wiem funkcja file() ładuje linijke tekstu po linijce i w taki sposób słownik wulgaryzmów jest napisany

słowo1
słowo2
.
.
.

Spróboje sie pobawić - moze mi sie coś uda.
Oczywiście czekam na jakąs podpowiedz również
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To niekoniecznie musi być spacja. Może to by dowolny "biały znak", a więc tabulator poziomy, pionowy, znak końca linii czy wspomniana spacja. By je usunąć można użyć na każdym elemencie tablicy funkcję trim(), która właśnie do tego służy. Obstaję jednak, że jest tam znacznik końca linii, dlatego zastosuj do file() flagę FILE_IGNORE_NEW_LINES i dopiero gdy to nie da rezultatu zastosuj trim().
Go to the top of the page
+Quote Post
ppietras86
post
Post #5





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 19.01.2010

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


FILE_IGNORE_NEW_LINES pomogło częściowo. Już tłumacze bo we wczesniejszym poscie sie pomyliłem

Przed zastosowaniem FILE_IGNORE_NEW_LINES
miałem postać
[0]=> string(5) "ala " 5 znaków - a tutaj niby są 4

po zastosowaniu FILE_IGNORE_NEW_LINES mam

[0]=> string(4) "ala "

Ciekawa sprawa - zaintrygowało mnie to
Dzięki wielkie za szybką odpowiedz - bawie sie teraz z Trim - dam znac co wyszło

Już mi działa (IMG:style_emoticons/default/smile.gif) )
Dziękuję ślicznie (IMG:style_emoticons/default/smile.gif)

Funkcja trim dała rady.

Zrobiłem tak:
  1. function badwords($message) {
  2. $badwords = file("page/wulgaryzmy.txt");
  3. $ile = count($badwords);
  4. for($i=0; $i<$ile; $i++) {
  5. $badwords[$i] = trim($badwords[$i]);
  6. }
  7. foreach($badwords as $badword) {
  8. $stars = str_repeat("*", strlen($badword));
  9. $message = str_replace($badword, $stars, $message);
  10. }
  11. return $message;
  12. }

Go to the top of the page
+Quote Post
thek
post
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Zamiast sprawdzania ile jest tych słów i for mogłeś użyć foreach, które są przystosowane do obsługi tablic. Mogłeś też użyć jednej z funkcji: array_walk, array_map, array_filter.

EDIT: Zauważ też, że niepotrzebnie tworzysz drugą pętlę. Trim mogłeś wrzucić od razu do tej, która sprawdza. Miałbyś wtedy postać:
  1. function badwords($message) {
  2. $badwords = file("page/wulgaryzmy.txt");
  3. foreach($badwords as $badword) {
  4. $badword = trim($badword);
  5. $stars = str_repeat("*", strlen($badword));
  6. $message = str_replace($badword, $stars, $message);
  7. }
  8. return $message;
  9. }
Jak widzisz logika działań sprawia, że ilość niepotrzebnych działań skraca się znacznie. Na samej dodatkowej pętli trimującej, której się pozbyłeś zaoszczędzisz znacznie, gdy plik wulgaryzmów będzie zawierał znaczną ilość wpisów.
Powód edycji: [thek]: Małe uzupełnienie.
Go to the top of the page
+Quote Post
ppietras86
post
Post #7





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 19.01.2010

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


Masz racje. Czasem z tą moją logiką jest na opak (IMG:style_emoticons/default/smile.gif) ))))
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Logikę miałeś jak najbardziej poprawną. To co zrobiłem ja można już ująć jako optymalizacja. To już polega na analizie algorytmu pod kątem powtarzalności działań, stosowania określonych form typów danych, funkcji i ich redukcja (lub zwiększenie) by osiągnąć określony z góry rezultat czasowy, zajętości pamięci (często te dwa się wykluczają - rekurencja w przykładowo quicksort). To czy umiesz sobie z tym radzić i takie miejsca wyłapywać to w dużej mierze umiejętność analizy kodu i doświadczenie. A te z czasem i odpowiednio dużą ilością napisanego kodu są zdobywane.
Go to the top of the page
+Quote Post
bolverk
post
Post #9





Grupa: Zarejestrowani
Postów: 57
Pomógł: 6
Dołączył: 10.08.2009
Skąd: Nowe Miasto Lubawskie

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


Ja problem wulgaryzmów obsłużyłem w inny sposób (przedstawiam go w wersji oryginalnej więc przepraszam za użyte wulgaryzmy w tablicy). Stworzyłem tablicę najczęstszych słów występujących w wulgaryzmach i za pomocą funkcji stristr wychwytuję je a gdy występują w ciągu wtedy zwracam błąd:

  1. $vulgarism = array('kurw', 'choler', 'dup', 'fiut',
  2. 'penis', 'cip', 'dziwka', 'huj',
  3. 'zajeb', 'pierd', 'fuck', 'hwdp',
  4. 'suka', 'suki', 'suko', 'zjeb',
  5. 'pizd');
  6.  
  7. for($i=0; $i<(count($vulgarism)); $i++)
  8. {
  9. if(stristr($string, $vulgarism[$i]))
  10. {
  11. $error = "Użyty wulgaryzm! Nieładnie.";
  12. return 0;
  13. }
  14. }

Za pomocą tego kawałka kodu wychwytuję nawet najbardziej wyrafinowane wiązanki (IMG:style_emoticons/default/smile.gif)

Ten post edytował bolverk 16.03.2010, 19:09:50
Go to the top of the page
+Quote Post
Tuomi
post
Post #10





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 12.12.2012

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


Witam. Ja mam takie pytanie: jak wprowadzić to tego kodu:
  1. <?php
  2. $wiadomosc = 'Ja cię zaraz ku[cenzura] zap[cenzura] pier[cenzura] chu[cenzura]. I nie powinno cenzurować słowa zakochuje.';
  3. $file_wulg = file("wulgaryzmy.txt");
  4. foreach($file_wulg as $wulgaryzm) {
  5. $wulgaryzm = trim($wulgaryzm);
  6. $cenzurowanie = str_repeat("*", strlen($wulgaryzm));
  7. $wiadomosc = str_replace($wulgaryzm, $cenzurowanie, $wiadomosc);
  8. }
  9. echo $wiadomosc;
  10. ?>

plik (lub tablicę) z wyjątkami. Pytam, ponieważ skrypt jest tak bardzo precyzyjny, że po wrzuceniu go na serwer i załadowaniu strony zobaczyłem: Ja cię zaraz ***** za*******e ********** chu[cenzura]. I nie powinno cenzurowa㇠sł‚owa zako*****.
Poza tym jak widać 4 wulgaryzm, nie został zagwiazdkowany.
Pozdrawiam
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 11:34