Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Skrypt usuwający wulgaryzmy Problem
Forum PHP.pl > Forum > PHP
ppietras86
]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 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.
thek
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.
ppietras86
Dzięki za tą funkcje. Nie znałem jej.
Nie ma krzaków ale zauważyłem co innego 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ż
thek
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().
ppietras86
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 smile.gif)
Dziękuję ślicznie 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. }

thek
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.
ppietras86
Masz racje. Czasem z tą moją logiką jest na opak smile.gif))))
thek
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.
bolverk
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 smile.gif
Tuomi
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
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.