Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Cenzor
Forum PHP.pl > Forum > Przedszkole
kaiba55
Witam serdecznie. Mam problem ze zrobieniem cenzora.
Chodzi o coś takiego, że mam plik cenzor.txt
Zawartość tego pliku przerzucam do tablicy. A potem chce by każdy element tej tablicy zamieniał na #CENZOR
Próbowałem tak:
  1. <?php
  2. $a="cenzor.txt";
  3. $plik=file($a);
  4. $z='napis a potem brzydkiesłowo <br>';
  5. for($i=count($plik);$i>=0;$i--)
  6. $f=str_replace($plik[$i],"#CENZOR", $z);
  7. echo $f;
  8.  
  9.  
  10.  
  11. ?>


Liczę na waszą pomoc.
Pozdrawiam.
Sephirus
Jeśli w $plik masz po prostu tablicę słow to wystarczy:

  1. $f = str_replace(array_reverse($plik),'#cenzor',$z);


O to chodziło? To w sumie jest to samo co napisałeś. Ale nie napisałeś do końca w czym problem/co nie działa...
kaiba55
chodzi o to że nie zamienia tego brzydkiego wyrazu na cenzor wink.gif
z twoim kodem też nie zamienia, pokazuje to samo zdanie co w zmiennej z
viking
Co nie zmienia faktu że robienie takiej cenzury zazwyczaj nie ma żadnego sensu. Zaraz zacznie się obchodzenie przez dowolne znaki albo zapis podobny fonetycznie.
http://php.net/manual/en/function.levenshtein.php
kaiba55
być może, na początek jednak wystarczy, potem przerzucę się na twoją funkcję, jak ją ogarnę

jednak nurtuje mnie co w moim kodzie jest źle smile.gif
Sephirus
To prawda - zgadzam się z przedmówcą. Pomogę jednak smile.gif

Autorze - sprawdź koniecznie kodowanie obu plików czyli tego cenzor.txt i skryptu w jakim to odpalasz. Dobrze by było też sprawdzić te dane które wrzucasz do cenzurowania. Wszystko musi mieć to samo kodowanie.

Po drugie sprawdź co dokładnie zawiera tablica $plik - może plik jest źle zrobiony i w tej tablicy są bzdury.
kaiba55
poprawiłem kodowania na te same, dalej nic
sprawdziłem co zawiera ten plik oczywiście wcześniej:
brzydkie słowo1
brzydkie słowo2
brzydkie słowo3

więc niby powinno być ok
chyba że nie mogę wykorzystać str_replace do zamiany elementu z tablicy na string
Sephirus
Możesz. Sprawdź jeszcze w ten sposób, że utwórz tablicę PHP i wpisz do niej te brzydkie słowa - zamiast ładować je z pliku. Tak dla testu.
kaiba55
kiedy zrobiłem tak:
  1. <?php
  2. $plik[0] = "brzydkie1";
  3. $plik[1] = "brzydkie2";
  4. $plik[2] = "brzydkie3";
  5. $z='napis a potem brzydkie1 <br>';
  6. for($i=count($plik);$i>=0;$i--)
  7. $f=str_replace($plik,"#CENZOR", $z);
  8. echo $f;
  9.  
  10.  
  11.  
  12. ?>
  13.  


to działa

Więc co jest nie tak jak wczytuje z pliku?
peter13135
print_r($plik); i zobacz czym różnią się te tablice.
kaiba55


Array ( [0] => słowo1 [1] => słowo2 [2] => słowo3 ) - zwykła tablica

Array ( [0] => ďťżsłowo1 [1] => słowo2 [2] => słowo3 ) - z pliku

Ale nawet jak dałem inne słowo do cenzury w przypadku w wersji z pliku, to też nie zamienia tego słowa na cenzor

może tego nie da się technicznie zrobić?
b4rt3kk
Użyj funkcji trim($klucz).

  1. $f=str_replace(trim($plik),"#CENZOR", $z);
kaiba55
kod wygląda teraz tak:
  1. <?php
  2. $a="cenzor.txt";
  3. $plik=file($a);
  4. $z='napis a potem brzydkie1 <br>';
  5. for($i=count($plik);$i>=0;$i--)
  6. $f=str_replace(trim($plik),"#CENZOR", $z);
  7. echo $f;
  8.  
  9. ?>


Ale niestety dalej nic to nie dało..
abort
Cytat(kaiba55 @ 27.09.2012, 13:15:48 ) *
może tego nie da się technicznie zrobić?

Da się. Wszystko się da. Z wyjątkiem (że wejdę na tematy wojskowe) tego, że nie da się okopać się w wodzie i nie da sie odkręcić orzełka od hełmu.
A do Twojego problemu, w dziś zaprezentowanym kodzie masz
  1. $f=str_replace($plik,"#CENZOR", $z);

A (skoro operujesz na tablicach) powinno chyba być:
  1. $f=str_replace($plik[$i],"#CENZOR", $z);


I na wszelki wypadek zrezygnuj (przynajmniej na czas testów) z polskich diakrytyków i ogranicz się do używania liter z zakresu US-ASCII.
b4rt3kk
Bo nie dodałeś indeksu, do $plik:

  1. $f=str_replace(trim($plik[$i]),"#CENZOR", $z);


a jakby nie było to jednak tablica.
kaiba55
tak też próbowałem już wcześniej i dalej nic
słowa w pliku tekstowym są małą literą i bez polskich znaków

edit: b4rt3kk twój sposób też na nic
viking
Zapisz jeszcze raz plik bez BOM (te 3 pierwsze znaki które wkleiłeś). Poszukaj ustawień edytora żeby to wyłączyć.
Sephirus
Ja bym stawiał dalej na kodowanie - coś musi być w tym pliku "cenzor.txt" z kodowaniem nie tak... Spróbuj to przerzucić może do zwykłego notatnika, utwórz tamten plik na nowo z kodowaniem takim jak skrypt/dane i wklej lub coś w ten deseń.
kaiba55
niestety nie do końca wiem jak to zrobić, jest w notatniku taka opcja?
jak coś korzystam z pspad, ale totalnie nie wiem gdzie to znaleźć

ten plik cenzor.txt zrobiłem w notatniku
oba moje pliki mają kodowanie UTF-8
b4rt3kk
To zadziała:

  1. <?php
  2. $a="cenzor.txt";
  3. $plik=file($a);
  4. $z='napis a potem brzydkie1 <br>';
  5. var_dump($plik);
  6. for ($i=0; $i<sizeof($plik); $i++)
  7. $f = str_replace(rtrim(trim($plik[$i])), '#CENZURA', $z);
  8. echo $f;
  9.  
  10. ?>


Zauważ, że po wyświetleniu var_dump tablicy z pliku pierwszy wiersz ma 2 nadprogramowe znaki.


EDIT:

Poprawka, wiem gdzie jest błąd. Otóż tak:

1. pierwszy obrót pętli, do $f przypisujemy 'napis a potem brzydkie1 <br>', ciąg zostaje zamieniony na 'napis a potem #CENZURA <br>'
2. po czym następuje kolejny obrót pętli, gdzie do $f znów przypisany jest ciąg 'napis a potem brzydkie1 <br>', więc ocenzurowany tekst znów jest w pierwotnej wersji.
3. jako wynik otrzymujemy więc 'napis a potem brzydkie1 <br>'

tak więc cenzuruje w pętli po jednym wyrazie, po czym znów mamy ciąg pierwotny i zostanie ocenzurowany tylko ten wyraz, który występuje pod ostatnim indeksem w pętli.

Poprawny kod:

  1. <?php
  2. $a="cenzor.txt";
  3. $plik=file($a);
  4. $z='napis a potem brzydkie1 <br>';
  5. var_dump($plik);
  6.  
  7. for ($i=0; $i<sizeof($plik); $i++)
  8. $z = str_replace(rtrim(trim($plik[$i])), '#CENZURA', $z);
  9. echo $z;
  10.  
  11. ?>
kaiba55
prawie dobrze hehe wink.gif
pozwole sobie wkleić z brzydkimi słowami smile.gif

array(4) { [0]=> string(7) "kurwa " [1]=> string(5) "huj " [2]=> string(12) "spierdalaj " [3]=> string(5) "pizda" } napis a potem #CENZURA

Pokazuje całą tablice, tylko nie wiem po co, zerknijcie proszę smile.gif

edit:
jeszcze jedno, gdy była zwykła tablica, a nie z pliku tekstowego, to nie było serii problemów o której mówisz, normalnie zamieniło na cenzura
viking
Cytat(kaiba55 @ 27.09.2012, 13:31:50 ) *
niestety nie do końca wiem jak to zrobić, jest w notatniku taka opcja?
jak coś korzystam z pspad, ale totalnie nie wiem gdzie to znaleźć

ten plik cenzor.txt zrobiłem w notatniku
oba moje pliki mają kodowanie UTF-8

Masz rozwiązanie http://forum.pspad.com/read.php?2,56470
b4rt3kk
Co znaczy, że prawie dobrze? Co nie działa?

Dałem var_dump byś sobie uzmysłowił gdzie jest problem przy pobieraniu danych z pliku.

Cytat
array(4) { [0]=> string(7) "kurwa " [1]=> string(5) "huj " [2]=> string(12) "spierdalaj " [3]=> string(5) "pizda" }


Widzisz typ wartości i długość? Np. 'kurwa' pisze, że to 7 znakowy string (strlen), a przecież powinno być 5, itd. Zakomentuj po prostu linię:

  1. //var_dump($plik);
kaiba55
aha, rozumiem dzięki
jednak mimo wszystko nie da się tego prościej wink.gif ?
wszystko kwestią tego ze jest to plik tekstowy?
Bo tak jak mówie, przy zwykłej tablicy normalnie zmieniało
b4rt3kk
Ale gdzie tu jest trudność? Przecież to bardzo prosty system. Owszem, znalazłoby się z milion rozwiązań tego samego problemu, np. w oparciu o bazę danych, a nie plik.
kaiba55
mógłbym cię prosić o wyjaśnienie tego:
  1. (rtrim(trim($plik[$i]))
b4rt3kk
Funkcja rtrim($string): http://www.php.net/rtrim
Usuwa białe znaki (spacje, znaki końca linii, itp) z końca ciągu wejściowego.

Funkcja trim($string): http://www.php.net/trim
Usuwa białe znaki z początku i końca ciągu wejściowego.

W sumie wystarczyłoby samo trim($string).
kaiba55
rozumiem, ale po co ten trim jest w tym przypadku?
przecież str_replace powinno wystarczyć do wyodrębnienia tego co mamy zamienić, czyż nie?
b4rt3kk
Definicja mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ): http://php.net/manual/en/function.str-replace.php

Trim jest po to, by usunąć białe znaki z wyrazu, który jest wyszukiwany w większym ciągu.

" wyraz1 /n" (tak wygląda szukany wyraz przed zastosowaniem trim) nie będzie pasować do "wyraz1" i nie zostanie zamieniony.
kaiba55
okej, rozumiem, bardzo dziękuje za pomoc
Sephirus
Trim nie jest tu potrzebny... wystarczyło wejść w manual polecenie file i wyłuskać coś takiego:

  1. $array = file($plik,FILE_IGNORE_NEW_LINES);
  2.  
  3. // tutaj normalnie robimy str_replace dając mu $array jako argument
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.