Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zamiany całych wyrazów
Forum PHP.pl > Forum > Przedszkole
Ardziej
Witam, oto napisałem sobie bardzo prosty skrypcik do zamiany słów smile.gif
Wygląda on tak:
  1. $from = array("ci","tobie"
  2. $to = array("Ci","Tobie");
  3. $tekst = str_replace($from, $to, $tekst);

Jednak problem jest taki, że w przypadku wyrazu np. daci zamieni to na daCi, a chodzi oto aby osobne wyrazy, co do spacji no to nie najlepsze rozwiązanie ponieważ zamiast spacji może być np. ","
Można by było to zrobić w preg_replece jednak jest to strasznie mega wielkie do ogarnięcia w chwilę.
Pozdrawiam smile.gif
Noidea
Wyrażenia regularne są strasznie mega wielkie, ale to chyba jedyne rozsądne rozwiązanie. Teoretycznie powinno wystarczyć użycie
Kod
$tekst = preg_replace( "~\bci\b~", "Ci", $tekst ); // \b oznacza "granicę słowa"

które jest prostym wyrażeniem. W praktyce natomiast PHP nie rozpozna polskiej litery jako litery (będzie rozpoznawał granicę słowa między polską literą a zwykłą) i dalej ci się będzie psuło przy wyrażeniach typu "mąci". Pomoże dopiero emulowanie poprawnego działania \b przy użyciu przewidywania wprzód i wstecz. To jest strasznie mega wielkie, więc masz gotowca
  1. ?php
  2.  
  3. // Zakładam kodowanie UTF-8. Jeśli używasz innego trzeba będzie przerobić
  4. $from = array( "ci", "tobie" );
  5. $to = array( "Ci", "Tobie" );
  6. $tekst = "tobie mąci ci ciąg w ciasnej daci. tobie. .tobie .tobie tobie ci";
  7.  
  8. $elemCount = min( count( $from ), count( $to ) );
  9. for( $i = 0; $i < $elemCount; $i++ )
  10. {
  11. $fromWord = preg_quote( $from[$i], "~" );
  12. $toWord = $to[$i];
  13.  
  14. $tekst = preg_replace( "~(?<!\pL)" . $fromWord . "(?!\pL)~u", $toWord, $tekst );
  15. }
  16.  
  17. echo $tekst;
  18.  
  19. ?>
fiszol
Jeśli masz zamiar używać tego tylko w przypadkach jak w 1 poście to polecam funkcję ucfirst();
thek
Wyrażenia regularne rozpoznają polskie litery, ale domyślne kodowanie dla nich nie może być użyte. Niestety nigdy nie bawiłem się w to i nie wiem jak wymusić w RE użycie polskiego kodowania. Wiem, że jeśli się je zastosuje, to wyrażenie rozpozna, że ma do czynienia z polskim znakiem "ą" a nie znakiem pustym, ponieważ w nowszych wersjach można napisać w wyrażeniu [a-ż0-9] i jest ono prawidłowo interpretowane. Musiałbyś sprawdzić czy flaga u dla unicode coś zmieni smile.gif
Noidea
@thek Niestety flaga "u" nic nie daje w tym przypadku. Granica słowa (\b) zostaje dopasowana w tych miejscach:
^\w
\w$
\w\W
\W\w

\w to litery, cyfry i znak podkreślenia (\W - wszystko inne), ale dwubajtowe polskie litery z UTF-8 traktowane są jako dwa krzaki, które podchodzą raczej pod \W (nawet w przypadku użycia flagi "u").


O ile w przypadku iso-8859-2 czy windows-1250 pewnie dałoby radę "naprawić" \w ustawiając odpowiednie LOCALE, o tyle napisanie wyrażenia działającego identycznie jak \b dla kodowania utf-8 jest strasznie mega wielkie:
http://ideone.com/3vard

W takim wypadku lepiej sprawdzić, czy mb_ereg nie byłby lepszy.
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.