Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] pytanie odnośnie wyrażeń regularnych
Forum PHP.pl > Forum > Przedszkole
___
Witam,
piszę sobie skrypt który mi będzie zamieniać wyrazy na ich odpowiedniki np. słowo ala zamieni mi na ala ma kota (coś jak cenzura). napisałem sobie wyrażenie

  1. <?php
  2. $text = preg_replace( "/".$r['pattern']."/i", "$r['replace']", $text );
  3. ?>


tyle tylko, że jeżeli $r['pattern'] = ala a w tekście jest np. w tartaku nie ma bala to słowo ala też zostanie zamienione ? chcę zrobić dopasowanie strict, czyli jeżeli ma zamieniać ala to ma zamienić ala a nie także bala. Jak ulepszyć to wyrażenie questionmark.gif bardzo proszę o pomoc
golaod
Poszukaj na forum bo już z kimś pisaliśmy cenzora, dosłownie parę dni temu więc powinien być na tej albo następnej stronie.
___
no właśnie przejrzałem najpierw kilka (5) stron z tego działu i nie znalazłem tego tematu. Proszę więc o pomoc.

Nadmienię, że moje wyrażenie zaczerpnąłem z IPB, ale wole się upewnić
barthpl
Kiepsko szukałeś. Ostatnie wątki o cenzurowaniu to na przykład: Temat: PHPCenzura lub Temat: PHPCenzura.

Jeżeli natomiast chodzi o dokładne dopasowanie (takie jak opisujesz) to wyrażenie powinno uwzględniać znak poprzedzający (np.: spacja). Czyli powinno to wyglądać w następujący sposób:
  1. <?php
  2. echo $text = "Ala ma kota a kot ala gala ma alab balangę w głowie ala.<br/>";
  3.  
  4. $pattern[] = "/([s]{1})ala([s]{1})/i";
  5. $pattern[] = "/([^a-z0-1]{1})ala([s]{1})/i";
  6. $pattern[] = "/([s]{1})ala([^a-z0-1]{1})/i";
  7.  
  8. $replacement[] = " +++ ";
  9. $replacement[] = "+++ ";
  10. $replacement[] = " +++";
  11.  
  12. $text = preg_replace( $pattern, $replacement, $text );
  13.  
  14. echo $text;
  15. ?>


Zapewne istnieje lepszy sposób ale w tej chwili mi nie przychodzi do głowy. Działa chyba poprawnie bo nie zamienia 'ala' w słowie 'balangę'. Wynik skryptu jest następujący:
  1. Ala ma kota a kot ala gala ma alab balangę w głowie ala.<br/>
  2. Ala ma kota a kot +++ gala ma alab bALAngę w głowie +++<br/>


edit -->
właśnie zauważyłem, że ucina znaki interpunkcyjne... a zatem trzeba to jeszcze dopracować.
Crozin
  1. <?php
  2. $text = preg_replace( "/".$r['pattern']."/i", "$r['replace']", $text );
  3. ?>
zamień na
  1. <?php
  2. $text = preg_replace( "/(s+)".$r['pattern']."(s+)/i", '1' . $r['replace'] . '2', $text );
  3. ?>
I powinno być dobrze
golaod
ja bym raczej polecał coś bardziej konkretnego czyli jak we wcześniejszym wątku [PHP]Cenzor:
$str = 'ala ma ccc..ch.h.h.h.uoo.ooóouiii..i.jj..jaaaaaa';
echo preg_replace("/h(\.| |-)*(u|o|ó|(\.| |-))*(\.| |-)*(i|j|(\.| |-))*/i",'x',$str);
Dzięki temu możemy sobie pisać słowo "chuj" jak tylko chcemy używając spacji podkreśleń kropek a i tak będzie działało smile.gif
Można rozbudować o system wyjątków takich jak podsłu czy coś. (Zaznaczam, że to działa z każdym słowem wystarczy tylko chwilkę się zastanowić, a żadne mistrz bluzgu nie wygra z nami tongue.gif no chyba, że użyje niestandardowych znaków lub sposobów jak np. !@#$%^&*() ale to można w końcu dopisać prawda ?)
___
Mi nie jest potrzebne to do cenzurowania tylko do zamieniania na odpowiedniki jak pisałem w pierwszym poście, więc nie będzie żadnych wyrazów typu że jedna litera będzie specjalnie powielana, żeby filtr nie złapał czy coś. Nic z tych rzeczy smile.gif
Crozin
@golaod: zawsze wygra.

Zresztą zacytuję siebie z innego wątku:
Cytat
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)
golaod
@crozin skorzystaj może z mojego skryptu bo to co właśnie napisałeś... będzie łapane będzie również łapane powielanie liter,używanie . spacji podkreślenia myślnika a można dodać przecinki i inne rzeczy. uwzględnione jest też używanie o,ó zamiast u itd.
Ktoś kiedyś mądry powiedział "Wszystko jest do zrobienia". Dlatego jeśli chcemy popadać w skrajność to pisanie 444..uu..u.u.óó óo,oo.i.j nie ma sensu bo to już nie jest przekleństwo dlatego, że on sam je można powiedzieć ocenzurował.
@osoba_która_założyła_topic Poza tym napisałeś, że chodzi Ci o "coś jak cenzura"(cytat z Twojej wypowiedzi pierwszej) zatem mi się nasunęło to.
Warto go zmienić jeszcze na:
$str = 'ala ma ccc..ch.h.h.h.uoo.ooóouiii..i.jj..jaaaaaa';
echo preg_replace("/(h(\.| |-)*(u|o|ó|(\.| |-))*(\.| |-)*(i|j|(\.| |-))*)/i",'xxxx',$str);
czyli całe wyrażenie objąć jako atom dzięki temu zawsze będzie xxxx a nie różna ilość znaków x
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.