Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Zamiany całych wyrazów
Ardziej
post
Post #1





Grupa: Zarejestrowani
Postów: 64
Pomógł: 1
Dołączył: 5.05.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Noidea
post
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


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. ?>


--------------------
Go to the top of the page
+Quote Post
fiszol
post
Post #3





Grupa: Zarejestrowani
Postów: 452
Pomógł: 16
Dołączył: 25.05.2004
Skąd: Gorzów Wlkp.

Ostrzeżenie: (0%)
-----


Jeśli masz zamiar używać tego tylko w przypadkach jak w 1 poście to polecam funkcję ucfirst();


Ten post edytował fiszol 27.01.2011, 05:57:29


--------------------
\o/
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Noidea
post
Post #5





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


@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.

Ten post edytował Noidea 27.01.2011, 14:46:33


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 05:48