Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Closed TopicStart new topic
> [PHP] konwersja polskich znaków do łaćińskich odpowiedników, czyli zmina 'ą' na 'a', 'ć' na 'c', it
barthpl
post 24.07.2008, 13:00:08
Post #1





Grupa: Zarejestrowani
Postów: 142
Pomógł: 35
Dołączył: 5.12.2006
Skąd: Wrocław

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


witam,

Czy ktoś ma może pomysł/wiedzę w jaki sposób dokonać konwersji polskich znaków do ich łacińskich odpowiedników. Znaczy się aby we wskazanym stringu wszystkie wystąpienia 'ą' zamienić na 'a' i tak ze wszystkimi polskimi znakami.

Mój obecny pomysł to:
  1. <?php
  2. $arg1 = array('ą', 'Ą', 'ć', 'Ć', 'ę', 'Ę', 'ł', 'Ł', 'ń', 'Ń', 'ó', 'Ó', 'ś', 'Ś', 'ź', 'Ź', 'ż', 'Ż' );
  3. $arg2 = array('a', 'a', 'c', 'c', 'e', 'e', 'l', 'l', 'n', 'n', 'o', 'o', 's', 's', 'z', 'z', 'z', 'z' );
  4. $out = str_replace ( $arg1, $arg2, $str );
  5. ?>

Osobiście mi się to nie bardzo podoba i szukam czegoś bardziej automatycznego.

Podobną zamianę chciałbym dokonać na literkach francuskich i niemieckich. Wszelkie pomysły mile widziane. Z góry dzięki.

Ten post edytował boguszewski 24.07.2008, 13:34:47


--------------------
Jeżeli pomogłem rozwiązać Twój problem, kliknij pomógł.
Go to the top of the page
+Quote Post
nowotny
post 24.07.2008, 13:56:06
Post #2





Grupa: Zarejestrowani
Postów: 875
Pomógł: 122
Dołączył: 2.02.2008

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


Było już milion razy... poszukaj...
Go to the top of the page
+Quote Post
barthpl
post 19.08.2008, 14:01:48
Post #3





Grupa: Zarejestrowani
Postów: 142
Pomógł: 35
Dołączył: 5.12.2006
Skąd: Wrocław

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


Wtedy nie udało mi się znaleźć tego "milion razy". Jednak jakiś czas potem pojawił się temat gdzie problem został rozwiązany (post: http://forum.php.pl/php_Jak_stworzyc_funkc...ie_t100607.html).

Dzięki pomysłom (przykładom) przedstawionym przez uczestników tamtej dyskusji napisałem następującą funkcję:
  1. <?php
  2. function str2url( $str, $strtolower = true )
  3. {
  4. // konwersja znaków utf do znaków podstawowych;
  5. $str = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
  6.  
  7. // Niektóre francuskie i niemieckie litery pozostawiają po takiej konwersji (jak powyżej) 
  8. // dodatkowe znaki. Poniższe dwie linijki te znaki wycinają; 
  9. $charsArr = array( '^', ''', '"', '`', '~');
  10. $str = str_replace( $charsArr, '', $str );
  11.  
  12. $str = preg_replace( "/[^a-z0-1-]{1}/i", '_', $str );
  13. while( strcmp($str, $str = str_replace( array('__', '--'), array('_', '-'), $str)) != 0 );
  14. return $strtolower ? strtolower( $str ) : $str;
  15. }
  16. ?>


Funkcja transformuje przekazany string ($str) do postaci złożonej tylko i wyłącznie z standardowych liter [a-z], cyfr [0-1] oraz znaków _ i -. Wielokrotne połączenie _ lub - będzie zredukowane do jednego znaku (odpowiednio _ lub -). Jeżeli drugi parametr ($strtolower) będzie ustawiony jako true (domyślna wartość) funkcja zmieni wielkość wszystkich liter na małe. W przeciwnym wypadku wielkość liter nie ulegnie zmianie.

Przykładowe użycie
  1. <?php
  2. echo $str = 'ąęśćłńóżźßüöäëáéíúçčîôŕâęűůďń------____';
  3. echo str2url( $str );
  4. ?>

da następujący efekt
Kod
ąęśćłńóżźßüöäëáéíúçèîôàâêûùïñ------____
aesclnozzssuoaeaeiuceioaaeuuin-_


Uwaga: wszystkie znaki zostaną pozbawione ogonków, akcentów i 'umlałtów'. Niemieckie 'ß' zostanie zamienione na 'ss' i zawsze będą to małe litery.


--------------------
Jeżeli pomogłem rozwiązać Twój problem, kliknij pomógł.
Go to the top of the page
+Quote Post
dEF
post 6.01.2009, 00:37:11
Post #4





Grupa: Zarejestrowani
Postów: 15
Pomógł: 1
Dołączył: 31.03.2006

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


Pozwoliem sobie usprawnic powyzsza funkcje.
  1. <?php
  2. function str2url( $str, $replace = "-" )
  3.    {
  4.        // konwersja znaków utf do znaków podstawowych;
  5.        $str = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
  6.  
  7.        // Niektóre francuskie i niemieckie litery pozostawiają po takiej konwersji (jak powyżej)
  8.        // dodatkowe znaki. Poniższe dwie linijki te znaki wycinają;
  9.        $charsArr =  array( '^', ''', '"', '`', '~');
  10.        $str = str_replace( $charsArr, '', $str );
  11.  
  12.        $return = trim(ereg_replace(' +',' ',preg_replace('/[^a-zA-Z0-9s]/','',strtolower($str))));
  13.        return str_replace(' ', $replace, $return);
  14.    }
  15. ?>

przykładowe użycie:
  1. <?php
  2. $str = "Dziesięć filmów, których nie możesz przegapić w 2009 roku!";
  3. echo $str;
  4. echo str2url($str);
  5. echo str2url($str, '_');
  6. ?>

da wynik
  1. Dziesięć filmów, których nie możesz przegapić w 2009 roku!
  2. dziesiec-filmow-ktorych-nie-mozesz-przegapic-w-2009-roku
  3. dziesiec_filmow_ktorych_nie_mozesz_przegapic_w_2009_roku

podczas gdy poprzednia funkcja dawała
  1. dziesiec_filmow_ktorych_nie_mozesz_przegapic_w_00_roku_

generalnie oczyscilem troche kod i poprawilem blad w wyrazeniu regularnym.
Dodatkowo jako zmienna $replace podajemy dowolny znak na jaki ma byc uzyty w zastepstwie.
Go to the top of the page
+Quote Post
haron
post 25.01.2011, 23:46:36
Post #5





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 25.01.2011

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


  1. function str2url( $str, $replace = "-" ){
  2.  
  3. // konwersja znaków utf do znaków podstawowych
  4. $str = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
  5.  
  6. // Niektóre francuskie i niemieckie litery pozostawiają po takiej konwersji (jak powyżej)
  7. // dodatkowe znaki. Poniższe dwie linijki te znaki wycinają
  8.  
  9. $charsArr = array( '^', "'", '"', '`', '~');
  10. $str = str_replace( $charsArr, '', $str );
  11.  
  12. $return = trim(ereg_replace(' +',' ',preg_replace('/[^a-zA-Z0-9\s]/','',strtolower($str))));
  13. return str_replace(' ', $replace, $return);
  14. }


zabrakło jednego znaku w preg_replace('/[^a-zA-Z0-9\s]/','',strtolower($str))
Go to the top of the page
+Quote Post
vojt
post 20.06.2012, 12:21:26
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 10.05.2012

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



Od PHP 5.3 pojawia się następujący błąd:
Deprecated: Function ereg_replace() is deprecated
Funkcja teraz działa prawidłowo.

  1. function str2url( $str, $replace = "-" ){
  2.  
  3. // konwersja znaków utf do znaków podstawowych
  4. $str = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
  5.  
  6. // Niektóre francuskie i niemieckie litery pozostawiają po takiej konwersji (jak powyżej)
  7. // dodatkowe znaki. Poniższe dwie linijki te znaki wycinają
  8.  
  9. $charsArr = array( '^', "'", '"', '`', '~');
  10. $str = str_replace( $charsArr, '', $str );
  11.  
  12. $return = trim(preg_replace('# +#',' ',preg_replace('/[^a-zA-Z0-9\s]/','',strtolower($str))));
  13. return str_replace(' ', $replace, $return);
  14. }

Go to the top of the page
+Quote Post
piotrooo89
post 20.06.2012, 12:23:36
Post #7


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




aleś odgrzebał kotleta...


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

Closed TopicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 10.06.2024 - 21:03