--
+ ' .-. .
, * ) )
http://kosmosik.net/ . . '-' . kK
> http://nl3.php.net/manual/en/function.mb-ereg-replace.php
Nie za bardzo wiem jak miałaby wyglądać regułka, w perl jest tr/xyz/zxy/cds, w
PHP nie wiem...?
No bo chyba nie mamy na myśli przelatywania stringu znak po znaku w pętli po
tablicy transliteracji? A może mamy? Jak kosztowne jest takie wywołanie? Bo
może nie ma o co kruszyć kopii...
ostatni wpis na samym dole
[code]
function mb_str_ireplace($co, $naCo, $wCzym)
{
$wCzymM = mb_strtolower($wCzym);
$coM = mb_strtolower($co);
$offset = 0;
while(($poz = mb_strpos($wCzymM, $coM, $offset)) !== false)
{
$offset = $poz + mb_strlen($naCo);
$wCzym = mb_substr($wCzym, 0, $poz). $naCo .mb_substr($wCzym,
$poz+mb_strlen($co));
$wCzymM = mb_strtolower($wCzym);
}
return $wCzym;
}[/code]
po lekturze http://nl3.php.net/manual/en/function.mb-eregi-replace.php
jest przykład funkcji
<?php
function do_translit($st) {
$replacement = array(
"й"=>"i","ц"=>"c","у"=>"u","к"=>"k","е"=>"e","н"=>"n",
"г"=>"g","ш"=>"sh","щ"=>"sh","з"=>"z","х"=>"x","ъ"=>"\'",
"ф"=>"f","ы"=>"i","в"=>"v","а"=>"a","п"=>"p","р"=>"r",
"о"=>"o","л"=>"l","д"=>"d","ж"=>"zh","э"=>"ie","ё"=>"e",
"я"=>"ya","ч"=>"ch","с"=>"c","м"=>"m","и"=>"i","т"=>"t",
"ь"=>"\'","б"=>"b","ю"=>"yu",
"Й"=>"I","Ц"=>"C","У"=>"U","К"=>"K","Е"=>"E","Н"=>"N",
"Г"=>"G","Ш"=>"SH","Щ"=>"SH","З"=>"Z","Х"=>"X","Ъ"=>"\'",
"Ф"=>"F","Ы"=>"I","В"=>"V","А"=>"A","П"=>"P","Р"=>"R",
"О"=>"O","Л"=>"L","Д"=>"D","Ж"=>"ZH","Э"=>"IE","Ё"=>"E",
"Я"=>"YA","Ч"=>"CH","С"=>"C","М"=>"M","И"=>"I","Т"=>"T",
"Ь"=>"\'","Б"=>"B","Ю"=>"YU",
);
foreach($replacement as $i=>$u) {
$st = mb_eregi_replace($i,$u,$st);
}
return $st;
}
?>
> Istnieje jakaś funkcja (czy biblioteka) do transliteracji z polskiego na
> podstawowy łaciński? Tzn. zamianę wszystkich wystąpień polskich znaków
> diakrytycznych na odpowiedniki z alfabetu łacińskiego (ą -> a, ć -> c
> ...).
> Dla ułatwienia stringi są w UTF. :)
>
hmm... moze http://pl.php.net/manual/pl/function.iconv.php i wyjscie jako
ASCII//TRANSLIT ?
[...]
> po lekturze http://nl3.php.net/manual/en/function.mb-eregi-replace.php
>
> jest przykład funkcji
>
> <?php
> function do_translit($st) {
> $replacement = array(
> "й"=>"i","ц"=>"c","у"=>"u","к"=>"k","е"=>"e","н"=>"n",
[...]
> "Ь"=>"\'","Б"=>"B","Ю"=>"YU",
> );
>
> foreach($replacement as $i=>$u) {
> $st = mb_eregi_replace($i,$u,$st);
> }
> return $st;
> }
> ?>
po co tu eregi? preg jest AFAIK lepsze, ale i tak IMO niepotrzebne,
wyglada ze strtr spokojnie wystarczy, a powinno byc sporo szybsze...
>>>> Istnieje jakaś funkcja (czy biblioteka) do transliteracji z polskiego na
>>>> podstawowy łaciński? Tzn. zamianę wszystkich wystąpień polskich znaków
>>>> diakrytycznych na odpowiedniki z alfabetu łacińskiego (ą -> a, ć -> c
>>>> ...). Dla ułatwienia stringi są w UTF. :)
>>> http://nl3.php.net/manual/en/function.mb-ereg-replace.php
>> Nie za bardzo wiem jak miałaby wyglądać regułka, w perl jest tr/xyz/zxy/cds,
>> w PHP nie wiem...?
>> No bo chyba nie mamy na myśli przelatywania stringu znak po znaku w pętli po
>> tablicy transliteracji? A może mamy? Jak kosztowne jest takie wywołanie? Bo
>> może nie ma o co kruszyć kopii...
> ostatni wpis na samym dole
Sorry nie jestem koderem copy&paste oraz zanim zapytałem na grupie to szukałem
rozwiązania i na to też się natknąłem. Szczerze mówiąc nie wiem *praktycznie*
jak to wpłynie na wydajność bo nie mierzyłem, ale w samej teorii ma moim
zdaniem niepotrzebnie dużą złożoność obliczeniową. W przypadku jednego
wywołania to może nie mieć znaczenia, ale ja będę wywoływał to bardzo dużo razy
i to w kolejce której sprawne opróżnienie jest sprawą krytyczną, a każde
opóźnienie spowalnia całość (no takie mam wymagania, że to musi być PHP).
Ergo weź prześledź co robi ten kod. Jest to bardzo prymitywne podejście do
problemu.
(ciach copy&paste)
> po co tu eregi? preg jest AFAIK lepsze, ale i tak IMO niepotrzebne, wyglada
> ze strtr spokojnie wystarczy, a powinno byc sporo szybsze...
Przeczytaj temat posta (albo może ja o czymś nie wiem).
>> Istnieje jakaś funkcja (czy biblioteka) do transliteracji z polskiego na
>> podstawowy łaciński? Tzn. zamianę wszystkich wystąpień polskich znaków
>> diakrytycznych na odpowiedniki z alfabetu łacińskiego (ą -> a, ć -> c ...).
>> Dla ułatwienia stringi są w UTF. :)
> hmm... moze http://pl.php.net/manual/pl/function.iconv.php i wyjscie jako
> ASCII//TRANSLIT ?
No właśnie nie. Robię tak:
<?php
$in="Założyć gęślą jaźń";
$out=iconv("UTF-8","ASCII//TRANSLIT",$in);
echo $out;
?>
I dostaję "Za?o?y? g??l? ja??".
:\
>>> Istnieje jakaś funkcja (czy biblioteka) do transliteracji z polskiego na
>>> podstawowy łaciński? Tzn. zamianę wszystkich wystąpień polskich znaków
>>> diakrytycznych na odpowiedniki z alfabetu łacińskiego (ą -> a, ć -> c
>>> ...). Dla ułatwienia stringi są w UTF. :)
>> hmm... moze http://pl.php.net/manual/pl/function.iconv.php i wyjscie jako
>> ASCII//TRANSLIT ?
> No właśnie nie. Robię tak:
> <?php $in="Założyć gęślą jaźń"; $out=iconv("UTF-8","ASCII//TRANSLIT",$in);
> echo $out; ?>
> I dostaję "Za?o?y? g??l? ja??".
> :\
Aaa no i:
kosmosik$ enca translit.php
Universal transformation format 8 bits; UTF-8
> Ergo weź prześledź co robi ten kod. Jest to bardzo prymitywne podejście do
> problemu.
Tzn. może w sumie (my bad) złożoność się nie zmienia natomiast wolałbym takie
przetwarzanie zrzucać "niżej" (do biblioteki napisanej w języku niższego
poziomu) bo to się wydajniej wykonuje.
A nie może być po prostu:
function foo($s)
{
$data = array(
"\xc4\x85" => "a", "\xc4\x84" => "A", "\xc4\x87" => "c", "\xc4\x86"
=> "C",
"\xc4\x99" => "e", "\xc4\x98" => "E", "\xc5\x82" => "l", "\xc5\x81"
=> "L",
"\xc3\xb3" => "o", "\xc3\x93" => "O", "\xc5\x9b" => "s", "\xc5\x9a"
=> "S",
"\xc5\xbc" => "z", "\xc5\xbb" => "Z", "\xc5\xba" => "z", "\xc5\xb9"
=> "Z",
"\xc5\x84" => "n", "\xc5\x83" => "N");
return strtr($s, $data);
}
? Jest szybkie (jak na PHP ;]), i u mnie się to sprawdza od dłuższego
czasu...
Pozdr
Exe Very Cute
O. Dzięki. ;)
To raczej wygląda na problem z localesami, bo to powinno działać (i SOA#1).
.pk.
> ** Jordan Szubert <to_jest_pra...@mielonka.servebeer.com> wrote:
>
>> po co tu eregi? preg jest AFAIK lepsze, ale i tak IMO niepotrzebne,
>> wyglada
>> ze strtr spokojnie wystarczy, a powinno byc sporo szybsze...
>
> Przeczytaj temat posta (albo może ja o czymś nie wiem).
nadal nie widze, czemu cos takiego ma nie dzialac...
strtr($in, array(
"\xc4\x85" => "a", "\xc4\x84" => "A", "\xc4\x87" => "c", "\xc4\x86" =>
"C",
"\xc4\x99" => "e", "\xc4\x98" => "E", "\xc5\x82" => "l", "\xc5\x81" =>
"L",
"\xc3\xb3" => "o", "\xc3\x93" => "O", "\xc5\x9b" => "s", "\xc5\x9a" =>
"S",
"\xc5\xbc" => "z", "\xc5\xbb" => "Z", "\xc5\xba" => "z", "\xc5\xb9" =>
"Z",
"\xc5\x84" => "n", "\xc5\x83" => "N" ));
>> po co tu eregi? preg jest AFAIK lepsze, ale i tak IMO niepotrzebne,
>> wyglada ze strtr spokojnie wystarczy, a powinno byc sporo szybsze...
>
> Przeczytaj temat posta (albo może ja o czymś nie wiem).
Ano najwyraźniej nie wiesz, że UTF-8 jest zaprojektowany tak, żeby bajtowy find'n'replace działał prawidłowo (ciąg bajtów reprezentujący codepoint nigdy nie jest podciągiem innego codepointu).
Poza tym jak już wyrażenia regularne, to nie przestarzałe (mb_)ereg, tylko preg z flagą u.
--
http://pornel.net
this.author = new Geek("porneL");
>>> po co tu eregi? preg jest AFAIK lepsze, ale i tak IMO niepotrzebne,
>>> wyglada ze strtr spokojnie wystarczy, a powinno byc sporo szybsze...
>> Przeczytaj temat posta (albo może ja o czymś nie wiem).
> nadal nie widze, czemu cos takiego ma nie dzialac...
> strtr($in, array(
> "\xc4\x85" => "a", "\xc4\x84" => "A", "\xc4\x87" => "c", "\xc4\x86" =>
> "C",
> "\xc4\x99" => "e", "\xc4\x98" => "E", "\xc5\x82" => "l", "\xc5\x81" =>
> "L",
> "\xc3\xb3" => "o", "\xc3\x93" => "O", "\xc5\x9b" => "s", "\xc5\x9a" =>
> "S",
> "\xc5\xbc" => "z", "\xc5\xbb" => "Z", "\xc5\xba" => "z", "\xc5\xb9" =>
> "Z",
> "\xc5\x84" => "n", "\xc5\x83" => "N" ));
Powyższe działa ale nie jest to do końca to o czym pisałem, pytałem jak
zamienić ciąg "ą" na "a", powyższe zamienia ciąg "\xc4\x85" na "a". Jest pewna
subtelna różnica.
>>>> Istnieje jakaś funkcja (czy biblioteka) do transliteracji z polskiego na
>>>> podstawowy łaciński? Tzn. zamianę wszystkich wystąpień polskich znaków
>>>> diakrytycznych na odpowiedniki z alfabetu łacińskiego (ą -> a, ć -> c
>>>> ...). Dla ułatwienia stringi są w UTF. :)
>>> hmm... moze http://pl.php.net/manual/pl/function.iconv.php i wyjscie jako
>>> ASCII//TRANSLIT ?
>> No właśnie nie. Robię tak:
>> <?php $in="Założyć gęślą jaźń"; $out=iconv("UTF-8","ASCII//TRANSLIT",$in);
>> echo $out; ?>
>> I dostaję "Za?o?y? g??l? ja??".
> a locale ustawiles?
Dodałem do powyższego kodu "setlocale(LC_ALL, 'pl_PL');", w php.ini ustawiłem
na UTF-8 zgodnie z tym:
http://pl.php.net/manual/pl/iconv.configuration.php
I nadal powyższe nie działa.
W ilu jeszcze miejscach zmienia się locale w PHP? PHP dystrybucyjne z RHEL 5.3.
>>> po co tu eregi? preg jest AFAIK lepsze, ale i tak IMO niepotrzebne,
>>> wyglada ze strtr spokojnie wystarczy, a powinno byc sporo szybsze...
>> Przeczytaj temat posta (albo może ja o czymś nie wiem).
> Ano najwyraźniej nie wiesz, że UTF-8 jest zaprojektowany tak, żeby bajtowy
> find'n'replace działał prawidłowo (ciąg bajtów reprezentujący codepoint nigdy
> nie jest podciągiem innego codepointu).
> Poza tym jak już wyrażenia regularne, to nie przestarzałe (mb_)ereg, tylko
> preg z flagą u.
Np. tak:
http://pl.php.net/manual/pl/function.preg-replace.php#86394
Co jest wydajniejsze to czy strtr?
no powyzsze zamienia "ą" zakodowane w utf-8 na "a"... zapis "ą" ma rozne
znaczenie zalaznie od kodowania pliku, "\xc4\x85" zawsze jest "ą" w
utf-8...
innych roznic nie widze...
klasyczna odpowiedz brzmi "Zmierz", ale nie sadze by ogole regexpy byly
szybsze niz dedykowane do tego strtr...
>> a locale ustawiles?
>
> Dodałem do powyższego kodu "setlocale(LC_ALL, 'pl_PL');", w php.ini
> ustawiłem na UTF-8 zgodnie z tym:
>
> http://pl.php.net/manual/pl/iconv.configuration.php
>
> I nadal powyższe nie działa.
>
> W ilu jeszcze miejscach zmienia się locale w PHP? PHP dystrybucyjne z
> RHEL 5.3.
A masz takie locale w systemie? Spróbuj też "pl_PL.utf8"
Jak nie masz, to zobacz localedef albo locale-gen.
> no powyzsze zamienia "ą" zakodowane w utf-8 na "a"... zapis "ą" ma rozne
> znaczenie zalaznie od kodowania pliku, "\xc4\x85" zawsze jest "ą" w
> utf-8...
> innych roznic nie widze...
Tak na marginesie, "ą" można też zapisać w UTF-8 jako "a\xCC\xA8".
>> Co jest wydajniejsze to czy strtr?
> klasyczna odpowiedz brzmi "Zmierz", ale nie sadze by ogole regexpy byly
> szybsze niz dedykowane do tego strtr...
Klasycznie wykonałem lazy web bo może ktoś już mierzył. :)