Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja nie zamienia poprawnie liter
Forum PHP.pl > Forum > Przedszkole
oi.
Funkcja:
  1. function clearDiacritics($sText)
  2. {
  3. $aReplacePL = array(
  4. 'ą' => 'a', 'ę' => 'e', 'ś' => 's', 'ć' => 'c',
  5. 'ó' => 'o', 'ń' => 'n', 'ż' => 'z', 'ź' => 'z', 'ł' => 'l',
  6. 'Ą' => 'A', 'Ę' => 'E', 'Ś' => 'S', 'Ć' => 'C',
  7. 'Ó' => 'O', 'Ń' => 'N', 'Ż' => 'Z', 'Ź' => 'Z', 'Ł' => 'L'
  8. );
  9. return str_replace(array_keys($aReplacePL), array_values($aReplacePL), $sText);
  10. }


Nie zamienia poprawnie liter Ą ą Ś ś - pomija je, w efekcie czego zamiast np ze słowa świąteczne wygenerować swiateczne otrzymuję witeczne. Gdzie jest problem ?
Wave
Funkcja u mnie działa prawidłowo. Skąd pobierasz tekst? Sprawdź kodowanie.
oi.
Dane pobieram z bazy SQL poprzez wywołanie:
  1. $modtytul = clearDiacritics($tytul);
Wave
dziwny objaw w sumie. sprawdź tekst z bazy bez tej funkcji, może kodowanie w bazie kradnie diakryty?
oi.
Zauważyłem, że ten problem jest w połączeniu z funkcją:
  1. function prepareURL($sText)
  2. {
  3. // pozbywamy się polskich znaków diakrytycznych
  4. $sText = clearDiacritics($sText);
  5. // dla przejrzystości wszystko z małych liter
  6. $sText = strtolower($sText);
  7. // wszystkie spacje zamieniamy na myślniki
  8. $sText = str_replace(' ', '-', $sText);
  9. // usuń wszytko co jest niedozwolonym znakiem
  10. $sText = preg_replace('/[^0-9a-z\-]+/', '', $sText);
  11. // zredukuj liczbę myślników do jednego obok siebie
  12. $sText = preg_replace('/[\-]+/', '-', $sText);
  13. // usuwamy możliwe myślniki na początku i końcu
  14. $sText = trim($sText, '-');
  15. return $sText;
  16. }

więc tu gdzie tkwi problem
Wave
  1. $sText = preg_replace('/[^0-9a-z\-]+/', '', $sText);

to Ci wywala diakryty.
Wicepsik

  1. $sText = preg_replace('/[^0-9a-z\-]+/', '', $sText); // ten kod usuwa wszystkie znaki które nie są literami od a-z (bez polskich) i liczb oraz znaku -, wiec usuwa ci literki ć, ż itd
oi.
Po usunięciu tej funkcji otrzymuję Świąteczne - a chcę swiateczne - czyli z malych liter i bez polskich znaków.
Wave
Coś zepsułeś pewnie.
A co to już nie wiem, bo nie widzę kodu.
oi.
Cały kod 2 funkcji :
  1. function clearDiacritics($sText)
  2. {
  3. $aReplacePL = array(
  4. 'ą' => 'a', 'ę' => 'e', 'ś' => 's', 'ć' => 'c',
  5. 'ó' => 'o', 'ń' => 'n', 'ż' => 'z', 'ź' => 'z', 'ł' => 'l',
  6. 'Ą' => 'A', 'Ę' => 'E', 'Ś' => 'S', 'Ć' => 'C',
  7. 'Ó' => 'O', 'Ń' => 'N', 'Ż' => 'Z', 'Ź' => 'Z', 'Ł' => 'L'
  8. );
  9. return str_replace(array_keys($aReplacePL), array_values($aReplacePL), $sText);
  10. }
  11.  
  12. function prepareURL($sText)
  13. {
  14. // pozbywamy się polskich znaków diakrytycznych
  15. $sText = clearDiacritics($sText);
  16. // dla przejrzystości wszystko z małych liter
  17. $sText = strtolower($sText);
  18. // wszystkie spacje zamieniamy na myślniki
  19. $sText = str_replace(' ', '-', $sText);
  20. // usuń wszytko co jest niedozwolonym znakiem
  21. //$sText = preg_replace('/[^0-9a-z\-]+/', '', $sText);
  22. // zredukuj liczbę myślników do jednego obok siebie
  23. $sText = preg_replace('/[\-]+/', '-', $sText);
  24. // usuwamy możliwe myślniki na początku i końcu
  25. $sText = trim($sText, '-');
  26. return $sText;
  27. }


wywołuję poprzez:
  1. $modtytul = prepareURL(clearDiacritics($tytul));
Wave
Naprawdę nie widzisz, że dwa razy wywołujesz clearDiacritics() ?
oi.
Próbuje na różne sposoby i po usunięciu clearDiacritics() z II funkcji nie pomaga sad.gif
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.