Autor | Zpráva | ||
---|---|---|---|
Mufna Profil |
#1 · Zasláno: 23. 10. 2009, 20:25:40 · Upravil/a: Mufna
Zdravím Vás. Prosím o radu, jak zajistit oříznutí textového řetězce, když mám následující podmínky:
1) oříznout zbytek řetězce po prvním (!) výskytu mezery nebo pomlčky v řetězci (neřeším, jestli není náhodu pomlčka hned na začátku) 2) pokud posledním znakem před první mezerou je některý ze znaků "á,é,í,ý,ě" -> nic neořezávat a zobrazit (ponechat) celý řetězec Mám na to nějakou funkci (týká se kontroly názvu obcí v ČR) v níž to chci ošetřit function kontrola ($val) { if atd. atd. return $val; } |
||
SwimX Profil |
#2 · Zasláno: 23. 10. 2009, 20:33:49 · Upravil/a: SwimX
function kontrola ($val) { $vysledek = split(' ', $val); //aj zapomněl jsem na tu pomlčku, tak já to ještě upravím :) if (in_array(substr($vysledek[0], -1), array('á', 'é', 'í', 'ý', 'ě'))) return $val; else return $vysledek[0]; } opravená funkce, řešící i pomlčku :) function kontrola ($val) { $vysledek = preg_split("/[\s-]+/", $val); if (in_array(substr($vysledek[0], -1), array('á', 'é', 'í', 'ý', 'ě'))) return $val; else return $vysledek[0]; } |
||
Mufna Profil |
#3 · Zasláno: 23. 10. 2009, 21:00:31
SwimX
Díky, ale bohužel u těch vybraných znaků se to zatím ořezává taky - Krásná Lípa -> zůstane jen "Krásná" :-( Zkoušel jsem split() i preg_split() |
||
SwimX Profil |
#4 · Zasláno: 23. 10. 2009, 21:05:27 · Upravil/a: SwimX
Mufna:
Mě to funguje dobře :( <?php function kontrola ($val) { $vysledek = preg_split('/[\s-]+/', $val); if (in_array(substr($vysledek[0], -1), array('á', 'é', 'í', 'ý', 'ě'))) return $val; else return $vysledek[0]; } echo kontrola('Krásná Lípa'); // vypíše Krásná Lípa ?> |
||
Mufna Profil |
#5 · Zasláno: 23. 10. 2009, 21:32:17
SwimX
Mě to prostě nefunguje :-( Vypisuje to pořád jen "Krásná". Mám tu funkci zvášť v PHP souboru, který se requiruje do jiného souboru, který se stará o vytváření XML souboru. Uvádím to jen pro pořádek, tady snad žádná chyba být nemůže. Celou funkci mám nyní takto (jsou tam ještě ošetřené nějaké konkrétní názvy, které obecně ošetřit dost dobře nejde). function check_location($val) { if ($val == 'Hradec Králové') { $val = 'Hr.Králové'; } if ($val == 'Hrochův Týnec') { $val = 'Hroch.Týnec'; } if ($val == 'Ronov nad Doubravou') { $val = 'Ronov n.D.'; } if ($val == 'Vojnův Městec') { $val = 'Vojn.Městec'; } if ($val == 'Ráby nad Labem') { $val = 'Ráby n.L.'; } if ($val == 'Lázně Bohdaneč') { $val = 'L.Bohdaneč'; } if ($val == 'Trhová Kamenice') { $val = 'Trh.Kamenice'; } // $result = split(' ', $val); $result = preg_split("/[\s-]+/", $val); if (in_array(substr($result[0], -1), array('á', 'é', 'í', 'ý', 'ě'))) { return $val; } else { return $result[0]; } } V souboru který to pak zpracovává: while($row=mysql_fetch_array($res)) { $i++; $lokalita = check_location($row["lokalita"]); echo check_location($row["lokalita"]); // tady jsem to zkusil vypsat a dopadá to tak jak nemá atd. atd. Nevím co by mohlo být špatně :-( |
||
SwimX Profil |
#6 · Zasláno: 23. 10. 2009, 21:37:23
V té funkci bych všude doporučil:
if ($val == 'Hradec Králové') {return $val = 'Hr.Králové'; } aby to nemuselo dělit řetězec podle mezer, atd. (detail) zkus ještě ten regulár dát do apostrofů (správně by v nich měl být myslím, jinak se tam escapujou ty znaky, a pak se to chová jinak, někde jsem o tom četl, ale divné že mě to vážně funguje :)) preg_split('/[\s-]+/', $val) |
||
Mufna Profil |
#7 · Zasláno: 23. 10. 2009, 21:42:39
SwimX
aby to nemuselo dělit řetězec podle mezer Ano, díky, to jsem chtěl nějak později taky ošetřit zkus ještě ten regulár dát do apostrofů Už se stalo, ale pořád mi to ne a ne šlapat :-((( |
||
SwimX Profil |
#8 · Zasláno: 23. 10. 2009, 22:04:37
Mufna:
to není možné :D koukej: http://www.plavec.borec.cz/upfiles/vaza.php <?php $array = array('Hradec Králové','Hrochův Týnec', 'Krásná Lípa', 'Nové Město Nad Metují', 'Frýdek Místek'); foreach($array as $v){ echo $v." => ".check_location($v)."<br>"; } function check_location($val) { if ($val == 'Hradec Králové') {return $val = 'Hr.Králové'; } if ($val == 'Hrochův Týnec') { return $val = 'Hroch.Týnec'; } if ($val == 'Ronov nad Doubravou') {return $val = 'Ronov n.D.'; } if ($val == 'Vojnův Městec') {return $val = 'Vojn.Městec'; } if ($val == 'Ráby nad Labem') {return $val = 'Ráby n.L.'; } if ($val == 'Lázně Bohdaneč') {return $val = 'L.Bohdaneč'; } if ($val == 'Trhová Kamenice') {return $val = 'Trh.Kamenice'; } // $result = split(' ', $val); $result = preg_split('/[\s-]+/', $val); if (in_array(substr($result[0], -1), array('á', 'é', 'í', 'ý', 'ě'))) { return $val; } else { return $result[0]; } } ?> |
||
Mufna Profil |
#9 · Zasláno: 23. 10. 2009, 22:19:11
SwimX
Teď mě napadá, nebude to souviset s kódováním ? V DB mám data v UTF-8. A české znaky á,é,í atd. asi zabírají víc než jeden bajt (doufám že jsem napsal správně bajt). |
||
Davex Profil |
#10 · Zasláno: 23. 10. 2009, 22:33:05
Souvisí to s UTF-8. Zaměň funkci substr() za mb_substr(). Možná bude ještě potřeba nastavení interního kódování:
mb_internal_encoding("UTF-8"); |
||
SwimX Profil |
#11 · Zasláno: 23. 10. 2009, 22:37:44
Zřejmě to tím opravdu bude, mb_substr neznám, děkuji za něj :)
|
||
Mufna Profil |
#12 · Zasláno: 23. 10. 2009, 22:50:04 · Upravil/a: Mufna
Davex
mb_substr() samo o sobě zatím nepomohlo. Kam mám umístit mb_internal_encoding("UTF-8") ? Přímo do funkce ? Takhle ? function check_location($val) { mb_internal_encoding("UTF-8") atd. } EDIT: Jo tak jsem to tam takhle dal a konečně to funguje, sláva :-) Jinak díky oběma, SwimX, Davex |
||
Časová prodleva: 15 let
|
0