Autor | Zpráva | ||
---|---|---|---|
Chates Profil |
#1 · Zasláno: 1. 10. 2008, 22:14:50
Zdravím, potřeboval bych funkci jako je preg_replace, str_replace ale funkční s češtinou. Mám text a potřebuji v něm nahradit určité řetězce. Příklad:
$component = array( "/eq_all_wheel_drive/", "/eq_abs/", "/eq_additional_lights/", "/eq_adjustable_drive_wheel/", "/eq_adjustable_seat/", "/eq_alarm/", "/eq_aut_aircon/", "/eq_aut_gear/", "/eq_central_lock/", "/eq_co_driver_airbag/", "/eq_driver_airbag/", "/eq_el_contr_back_win/", "/eq_el_contr_front_win/", "/eq_el_contr_mirrors/", "/eq_el_contr_win/", "/eq_gear_lock/", "/eq_heated_head_win/", "/eq_heated_mirror/", "/eq_heated_seats/", "/eq_hitch/", "/eq_immobilizer/", "/eq_leather_trim/", "/eq_lite_disky/" ); $translation = array( "pohon 4 x 4", "ABS", "přídavné světlomety", "nastavitelný volant", "výškově nastavitelná sedadla", "alarm", "aut. klimatizace", "aut. převodovka", "centrální zamykání", "airbag spolujezdce", "airbag řidiče", "el. okna", "el. přední okna", "el. zrcátka", "el. okna", "zámek řadící páky", "vyhřívané přední sklo", "vyhřívaná zrcátka", "vyhřívaná sedadla", "tažné zařízení", "imobilizér", "potahy kůže", "hliníková kola" ); $newEquip = preg_replace($component, $translation, $equip); Tohle nefunguje správně, neboť se to vždy zasekne na českých znacích. Poraďte prosím nejakou metodu, jak na to vyzrát, případně nějaké jiné funkce, které by řešily ten samý problém. Děkuji |
||
Kajman_ Profil * |
#2 · Zasláno: 1. 10. 2008, 22:30:38
Pokud to máte ve vícebytovém kódování, např. utf8, zkuste např.
http://cz.php.net/manual/en/function.mb-strpos.php#68646 |
||
Chates Profil |
#3 · Zasláno: 1. 10. 2008, 22:58:52
To bohužel zas nefunguje, jakmile se v tom vyskytne nějaký znak s diakritikou :-(
|
||
Chates Profil |
#4 · Zasláno: 1. 10. 2008, 23:20:24
Tak už jsem to rozchodil. Díky moc! Chyba byla u mě.
|
||
BetaCam Profil |
#5 · Zasláno: 2. 10. 2008, 05:19:37
Kajman_
Chates Já teda nevim nechtěl bych bejt za blbce, ale pokud vim tak preg_replace() funguje s utf8 naprosto normálně <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"> <head> <title>New document</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> <?php error_reporting(E_ALL); $equip = 'eq_all_wheel_drive,eq_abs,eq_additional_lights,eq_adjustable_drive_wh eel,eq_adjustable_seat, eq_alarm,eq_aut_aircon,eq_aut_gear,eq_central_lock,eq_co_driver_airb ag,eq_driver_airbag, eq_el_contr_back_win,eq_el_contr_front_win,eq_el_contr_mirrors,eq_el _contr_win,eq_gear_lock, eq_heated_head_win,eq_heated_mirror,eq_heated_seats,eq_hitch,eq_immo bilizer,eq_leather_trim, eq_lite_disky'; $component = array( "/eq_all_wheel_drive/","/eq_abs/","/eq_additional_lights/","/eq_adjust able_drive_wheel/","/eq_adjustable_seat/", "/eq_alarm/","/eq_aut_aircon/","/eq_aut_gear/","/eq_central_lock/","/e q_co_driver_airbag/","/eq_driver_airbag/", "/eq_el_contr_back_win/","/eq_el_contr_front_win/","/eq_el_contr_mirro rs/","/eq_el_contr_win/","/eq_gear_lock/", "/eq_heated_head_win/","/eq_heated_mirror/","/eq_heated_seats/","/eq_h itch/","/eq_immobilizer/","/eq_leather_trim/", "/eq_lite_disky/" ); $translation = array( "pohon 4 x 4","ABS","přídavné světlomety","nastavitelný volant","výškově nastavitelná sedadla","alarm","aut. klimatizace", "aut. převodovka","centrální zamykání","airbag spolujezdce","airbag řidiče","el. okna","el. přední okna", "el. zrcátka","el. okna","zámek řadící páky","vyhřívané přední sklo","vyhřívaná zrcátka","vyhřívaná sedadla", "tažné zařízení","imobilizér","potahy kůže","hliníková kola" ); $newEquip = preg_replace($component, $translation, $equip); echo $newEquip; ?> </body> </html> nevim jak vám, ale mě tenhle kód funguje naprosto validně. Nebude spíš chyba v tom, že ten soubor nemáte uložen ve správném kódování tedy utf-8?? |
||
Časová prodleva: 2 roky
|
|||
zener Profil * |
#6 · Zasláno: 14. 9. 2010, 00:06:26
Ackoliv se jedna o dost stare vlakno, je dle meho stale nedostatecne doreseno, proto prikladam zdroj a hlavne reseni problemu.
BetaCam: Ano, funguje, ale problem je v koncovych znacich, problem nastava treba u... preg_replace("/(.{6}).*/", "$1...", "textiČek"); Ono pismeno Č je totiž dvoubajtové, a proto vznika problem. Reseni je nekolik... 1. pouzit multibyte verzi str_replace, tedy mb_str_replace 2. pouzit POSIX regexp a jejich multibajtovou verzi, tedy mb_ereg_replace - to bych nedoporucoval, od verze 5.3 nejsou POISX regularni vyrazy podporovany 3. nejsnazsi je pridat do vzoru reg. vyrazu modifikator u - podpora unicode Mnou uvedeny priklad by pak mohl vypadat takto (zmena je pouze v pridani modifikatoru u) preg_replace("/(.{6}).*/u", "$1...", "textiČek"); |
||
Časová prodleva: 14 dní
|
|||
ehm Profil * |
#7 · Zasláno: 28. 9. 2010, 02:21:35
ani modifikátor u neřeší u mě zcela vše
např: $entry = "ě š č ř ž ý á í é ú ů a b c šč řž ýá íé ěě šš mě mš mč mř mž ab tx tx txt txt abc abcd ěš"; $entry_orig = $entry; $entry = preg_replace('/\s(\S{1,2}\s)+|(\S{21,})/',' ', $entry); $entry = implode(' ', array_keys(array_flip(explode(' ', preg_replace('#\s+#', ' ', $entry))))) . ' '; echo $entry_orig; echo "\n"; echo $entry; výsledkem by měly být slova delší než tři a kratší než 20 ... bohužel nejsou modifikátor u v tomto konkrétním příkladě nedělá nic zajímavé ale je, že jsem s různými typy replacu dosáhl diametrálně jiných výsledků tento si poradil zatím nejlépe s většinou znaků... ale i tak má mouchy poradil by někdo? |
||
Mastodont Profil |
#8 · Zasláno: 28. 9. 2010, 07:07:33
modifikátor u v tomto konkrétním příkladě nedělá nic
'/\s(\S{1,2}\s)+|(\S{21,})/' No když tam vůbec není, tak nemůže nic dělat ... |
||
ehm Profil * |
#9 · Zasláno: 28. 9. 2010, 09:53:03
myšleno pochopitelně tak, že
'/\s(\S{1,2}\s)+|(\S{21,})/' a '/\s(\S{1,2}\s)+|(\S{21,})\u/' je zcela stejný output jediné kdy to něco dělá je tato varianta '/\b([\S]{1,2}|[\S]{21,})\bu/' která bez u mrví kódování, ale výsledek je horší nechápu proč máš potřebu rejt, když je zcela jasný, že jsem si to vyzkoušel tak i jinak a když říkám, že v tom není rozdíl s a bez tak to mám asi ověřené ne? |
||
nightfish Profil |
#10 · Zasláno: 28. 9. 2010, 10:18:00
ehm:
„'/\s(\S{1,2}\s)+|(\S{21,})\u/'“ Modifikátory se píší až za ukončující delimiter, a to bez zpětného lomítka. |
||
ehm Profil * |
#11 · Zasláno: 29. 9. 2010, 14:03:13
nightfish: no vzdyt to tam tak v mem poslednim postu mam ... nebo ?
|
||
ehm Profil * |
#12 · Zasláno: 29. 9. 2010, 14:07:16
aha moje chyba
input $entry = "ABSC AD UAtTOO Ě Š Č Ž Ř Ž Ý Á Í É ě š č ř ž ý á í é ú ů a b c šč řž ýá íé ěě šš mě mš mč mř mž ab tx tx txt txt abc abcd ěš"; $entry = strtolower($entry); no s tímto replacem $entry = preg_replace('/\s(\S{1,2}\s)+|(\S{21,})/',' ', $entry); výsledek absc uattoo šč řž ýá íé ěě šš mě mš mč mř mž txt abc abcd ěš s tímto $entry = preg_replace('/\s(\S{1,2}\s)+|(\S{21,})/u',' ', $entry); výsledek absc uattoo txt abc abcd ěš tedy mnohem lepší, ale pořád tam ta jedna poslední mrcha zůstala |
||
tiso Profil |
#13 · Zasláno: 29. 9. 2010, 14:15:31
ehm: za jedno až dvojpísmenovým slovom predpokladáš medzeru, za tým posledným ju nemáš…
|
||
ehm Profil * |
#14 · Zasláno: 29. 9. 2010, 14:44:44
ha! díky za nakopnutí, ošetřím si to aby tam ta mrcha byla :)
|
||
ehm Profil * |
#15 · Zasláno: 1. 10. 2010, 18:50:07
tak ještě problém
nefunguje na delší slova než 21znaků $entry = "nejakejsilenedlouhejtextkterejjedlouhejproste šč řř echo nezasloužídostávala pppmpppmmpmfmpppfmší póóóóčkééééjjjjj vězeňskoprůmyslového nejpravděpodobnější работниками dííííííííííkes"; s tímhle si to bohužel neporadilo :( |
||
ehm Profil * |
#16 · Zasláno: 1. 10. 2010, 18:52:53
výstup je tento:
takže zase diakritika echo nezasloužídostávala pppmpppmmpmfmpppfmší póóóóčkééééjjjjj vězeňskoprůmyslového nejpravděpodobnější работниками dííííííííííkes |
||
Davex Profil |
#17 · Zasláno: 1. 10. 2010, 19:09:54
ehm:
„nefunguje na delší slova než 21znaků“ Pokud dobře počítám, tak se to chová přesně podle toho regulárního výrazu - ve výstupu nemá žádné slovo víc jak 20 znaků. |
||
Majkl578 Profil |
#18 · Zasláno: 1. 10. 2010, 19:40:43
Tady se hodí aserce.
$s = 'nejakejsilenedlouhejtextkterejjedlouhejproste šč řř echo nezasloužídostávala pppmpppmmpmfmpppfmší póóóóčkééééjjjjj vězeňskoprůmyslového nejpravděpodobnější работниками dííííííííííkes'; echo preg_replace('~(?<=^|\s)(\S{1,2}|\S{21,})(?=\s|$)~uU', '_', $s); //_ _ _ echo nezasloužídostávala pppmpppmmpmfmpppfmší póóóóčkééééjjjjj vězeňskoprůmyslového nejpravděpodobnější работниками dííííííííííkes |
||
ehm Profil * |
#19 · Zasláno: 1. 10. 2010, 20:30:47
Davex: sice to počítám taky tak, ale výjezd z db tyhle slova označil jako length 21+ ledažeby se slovo s diakritikou uložilo jako víceznaké?
|
||
Davex Profil |
#20 · Zasláno: 1. 10. 2010, 21:50:17
ehm:
V databázi bys místo LENGTH() měl asi použít CHAR_LENGTH() .
|
||
Časová prodleva: 14 dní
|
|||
ppooou Profil * |
#21 · Zasláno: 16. 10. 2010, 04:53:01
zener:
„1. pouzit multibyte verzi str_replace, tedy mb_str_replace“ Call to undefined function mb_str_replace() toz tak, asi mate php6? |
||
Nox Profil |
#22 · Zasláno: 16. 10. 2010, 08:59:45
php6 (zatím) neexistuje, leč "Sorry, but the function mb_str_replace is not in the online manual" ...
prošel jsem u PHP 5.3.3 funkce v mbstring a taky to tam není ale na Stackoverflow je o tom zmínka, tak nevim... |
||
Keeehi Profil |
#23 · Zasláno: 16. 10. 2010, 13:38:57
mb_str_replace oficiálně neexistuje. Všechny mb_* funkce najdete zde. Dole v poznámkách je však napsaná funkce, která funkci mb_str_replace (pokud neexistuje) vytvoří. Funkčnost jsem ale nezkoušel.
|
||
Časová prodleva: 14 let
|
0