Autor Zpráva
Chates
Profil
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 *
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
To bohužel zas nefunguje, jakmile se v tom vyskytne nějaký znak s diakritikou :-(
Chates
Profil
Tak už jsem to rozchodil. Díky moc! Chyba byla u mě.
BetaCam
Profil
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??
zener
Profil *
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");
ehm
Profil *
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
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 *
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
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 *
nightfish: no vzdyt to tam tak v mem poslednim postu mam ... nebo ?
ehm
Profil *
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
ehm: za jedno až dvojpísmenovým slovom predpokladáš medzeru, za tým posledným ju nemáš…
ehm
Profil *
ha! díky za nakopnutí, ošetřím si to aby tam ta mrcha byla :)
ehm
Profil *
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 *
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
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
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 *
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
ehm:
V databázi bys místo LENGTH() měl asi použít CHAR_LENGTH().
ppooou
Profil *
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: