Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

preg: html-entitet u UTF8 string

[es] :: PHP :: preg: html-entitet u UTF8 string

[ Pregleda: 1612 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Miroslav Ćurčić
ex mVeliki
Novi Sad

Član broj: 19034
Poruke: 1118
..2.252.195.static.beotel.net.



+19 Profil

icon preg: html-entitet u UTF8 string16.04.2009. u 21:55 - pre 183 meseci
Imao sam problem pri konvertovanju (s preg_replace) teksta koji ima html entitete unutar UTF8 stringa.

Primer:
Code:
preg_replace('/&#(\d+);/e', "chr(\\1)", 'Obućar - šđčćž');

Paterni su preuzeti sa (mislim) wwwphpnet/preg_replace i dobro radi u nekim drugim slučajevima.
Izgleda da je ovde problem to što preg_replace zamenjuje entitet jednim bajtom (funkcija chr) u ovom slučaju 007 (što je overflow od 263), a meni treba dvobajtni ("ć" = 196,135).

Na kraju sam napravio transalaciju svih 8 slova preko strtr funkcije, al to nije univerzalno rešenje, šta ako se pojavi još neki egzotični karakter?

Dakle, kako izvesti translaciju entiteta (u numeričkom obliku) unutar UTF8 stringa?
Ne mora uopšte sa regex, bitno je da radi,
a opet ne bih išao sa nekom komplikovanom analizom (tipa: petlja koja traži "&#" pa čitaj do ";" pa to konvertuj pa zameni) zbog brzine rada.

"The quieter you become, the more you are able to hear."
Blog | PowerCMS
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: preg: html-entitet u UTF8 string17.04.2009. u 00:11 - pre 183 meseci
Pozdrav,

pa ako mislimo na isto možda ovo može da pripomogne:

Code:

var_dump('Obućar');
var_dump(html_entity_decode('Obućar',null,'UTF-8'));
var_dump(preg_replace('/&#(\d+);/e', "chr(\\1)", 'Obućar'));


Ako je stranica sačuvana kao UTF-8 sa html_entity_decode dobije se string od sedam karaktera od kojih 2 odlaze na ć,
a ne 6 kao sa preg_replace-om. Ovo ne važi ako se ne koristi argument 'UTF-8'(dobije se 'Obućar' sa var_dump) .
 
Odgovor na temu

Miroslav Ćurčić
ex mVeliki
Novi Sad

Član broj: 19034
Poruke: 1118
..2.252.195.static.beotel.net.



+19 Profil

icon Re: preg: html-entitet u UTF8 string17.04.2009. u 01:12 - pre 183 meseci
Hvala Vlado, ali...

Warning: cannot yet handle MBCS in html_entity_decode()!

Izvini, promaklo mi je da napomenem da mi treba za jedan antički server gde se vrti PHP4.
Probao sam ovo ranije, kao najlogičnije.
"The quieter you become, the more you are able to hear."
Blog | PowerCMS
 
Odgovor na temu

Miroslav Ćurčić
ex mVeliki
Novi Sad

Član broj: 19034
Poruke: 1118
..2.252.195.static.beotel.net.



+19 Profil

icon Re: preg: html-entitet u UTF8 string17.04.2009. u 01:25 - pre 182 meseci
Ha, rešio,
našao sam negde funkciju koja konvertuje taj unicode broj u UTF8 par bajtova:
Code:

function unichr($c) {
    if ($c <= 0x7F) return chr($c);
     else if ($c <= 0x7FF) return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F);
     else if ($c <= 0xFFFF) return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
     else if ($c <= 0x10FFFF) return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
     else return false;
    }
}

i onda u paternu umesto "chr(\\1)" stavio "unichr(\\1)" i proradilo.

"The quieter you become, the more you are able to hear."
Blog | PowerCMS
 
Odgovor na temu

[es] :: PHP :: preg: html-entitet u UTF8 string

[ Pregleda: 1612 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.