Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Cenzura
Forum PHP.pl > Forum > Przedszkole
Wredny
Witam mam takie pytanie pisze skrypt który ocenzuruje mi słowa wulgarne.


zastanawiałem się jak to zrobić wykorzystam do tego funkcje str_replace i by to wyglądało tak:
  1. <?php
  2. $tekst = str_replace('wulgarneslowo1, '!cenzura!', $tekst);
  3. $tekst = str_replace('wulgarneslowo2, '!cenzura!', $tekst);
  4. $tekst = str_replace('wulgarneslowo3, '!cenzura!', $tekst;
  5. $tekst = str_replace('wulgarneslowo4, '!cenzura!', $tekst);
  6. $tekst = str_replace('wulgarneslowo5, '!cenzura!', $tekst);
  7. $tekst = str_replace('wulgarneslowo6, '!cenzura!', $tekst);
  8. ?>

tylko zamiast wulgarneslowo1 bylo by przekleństwo które zostanie zamienione na !cenzura!
ale takie wstawianie jest monotonne po prostu długo się wstawia.
moje pytanie czy nie da się tego zrobić tak że np.
Że utworze plik txt a w nim wulgaryzmy jeden pod drugim:
Kod
wulgarneslowo1
   wulgarneslowo2
   wulgarneslowo3
   wulgarneslowo4
   wulgarneslowo5
   wulgarneslowo6
   wulgarneslowo7

i tak dalej i potem skrypt pobierze te słowa i wstawi je sam do funkcji str_replace?
Shili
Da się jak najbardziej. Poczytaj sobie w manualu o plikach (fopen, file_get_contents, file itd), potem pobierz sobie wszystkie słowa z pliku do tablicy, bo przecież str_replace może jako argumenty przyjmować tablice winksmiley.jpg
f1xer
  1. <?php
  2. $cenzura=file("sciezka/do/pliku/plik.txt");
  3. foreach($cenzura as $slowo)
  4. {
  5. $tekst=str_replace($slowo,'!cenzura!',$tekst);
  6. }
  7. echo $tekst;
  8. ?>


Powinno działać
Wredny
a jeżeli moja baza zawiera 2145 słowa czy przy wykonywaniu skryptu nie obciąży to serwera?
klocu
Możesz to zrobić podobnie jak wyżej z małym ale.
Ładujesz cały plik poprzez file. Masz go już w tablicy Pamiętaj że na końcu każdego wiersza masz znak kończący więc musisz się go pozbyć.

Ale lepiej byłoby zamienić całą tablicę wczytaną przez file JEDNYM str_replacem a nie wykonywanym tysiące razy. Skoro robisz to samo i możesz to zrobić prościej rób to.

Zresztą koledzy wyżej dali Ci przykład i w oparciu o to zbuduj własny system.

Kod f1xer'a nie działa bo wali się to na znaku końca linii jak mówiłem. (działa tylko na ostatnim słowie po którym nie ma entera)
Wredny
może jest proste ale ja np nie wiem prostej rzeczy po co w przykładzie który podał f1xer na końcu echo $tekst;? to do tego aby mi wyświetliło ocenzurowany tekst? i dlaczego tam nie ma takiego czegoś na początku jak :
  1. <?php
  2. $cos = fopen("shouts.txt","r");
  3. ?>

?
Możecie dać "jaśniejszy" przykład ?


i cos nie tak z tym kodem f1xer pobiera tylko jeden wyraz
klocu
To jest proste. To są podstawy w manualu. Nie ma fopen bo jest file (wczytuje cały plik do tablicy - każdy rząd nowym rekordem).
Echo jest do wyświetlenia.
Patrząc od strony optymalizacji, można to wczytać poprzez file, obciąć białe znaki i nadpisać tablicę, ale robić to za każdym razem - serwer Ci się spoci.

Ten kod nie pobiera jednego wyrazu, tylko serię wyrazów.
Wredny
no dobra ale dlaczego to mi cenzuruje tylko ostatnie słowo? z pliku txt?
Михаил_з_СССР
Tylko pamiętaj by przed słowem takim jak np. (TYLKO PRZYKŁAD!) chuj dać spację. Jeśli tak nie zrobisz gdy ktoś napisze nie podsłuchuj, wyświetli się "nie podsłu!cenzura!". Taka mała rada na przyszłość.
Crozin
Plik ze slowami
Kod
abc1
abc2
abc3
abcN
Kod skryputu:
  1. <?
  2.  
  3. $words = file('words.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  4.  
  5.  
  6. $someText = str_replace($words, '!cenzura', $someText);
  7.  
  8. ?>
___
Cytat
Tylko pamiętaj by przed słowem takim jak np. (TYLKO PRZYKŁAD!) chuj dać spację. Jeśli tak nie zrobisz gdy ktoś napisze nie podsłuchuj, wyświetli się "nie podsłu!cenzura!". Taka mała rada na przyszłość.



Czyli jeżeli dobrze rozumiem.
mam słowo ala, które ma mi zamienić na kasia, aby słowa bala mi nie zamieniło na bkasia musze przed ala dać spację questionmark.gif czy źle rozumiem questionmark.gif

Pattern musi zaczynać się od spacji, aby dopasowanie było strict a nie loose questionmark.gif czy może da się to zastąpić inaczej, bo ja mam preg_replace początkowo do tego użyty ale nie chciałbym dodawać za każdym razem spacji na początek bo łatwo można o tym zapomnieć.

PS. takie dodatkowe pytanie lepiej pattern i replace trzymać w bazie czy lepiej walnąć sobie to w XML questionmark.gif
Crozin
  1. <?
  2. $words = file('words.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  3. foreach($words as &$word)
  4. $word = ' ' . $word . ' ';
  5.  
  6. $someText = str_replace($words, '!cenzura', $someText);
  7. ?>
Chociaż wg mnie tworzenie cenzury jest bezcelowe... jeśli ktoś będzie chciał Ci nabluzgać to nabluzga (z tym, że zamiast PRZEKLENSTWO napisze PRZE KLE NSTWO). Jeśli komuś się zapomni co nieco, niech moderator wyedytuje treść, a delikfenta zbanować (dać ostrzeżenie)

Cytat
PS. takie dodatkowe pytanie lepiej pattern i replace trzymać w bazie czy lepiej walnąć sobie to w XML
W czym Ci wygodniej (mi osobiście byłoby w bazie danych). Zawsze możesz zrobić cache'a tego.
-mateomm-
W aktualnej formie skryptu do cenzurowania, jaki podany jest wyżej każde wystąpienie słowa wulgarnego będzie cenzurowane. A czy jest możliwe, aby nasze wyrażenie regularne nie cenzurowało słowa będącego linkiem ?

mam np tekxt... <a href="#">abc wylgaryzm abc</a> ..., text

chciałbym aby w tekście słowa mi cenzurowało, ale w linku nie. Czy jest to możliwe ?
Moge liczyc na Wasza pomoc ?

Z gory bardzo dziekuje i pozdrawiam
M
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.