Autor Zpráva
Mufna
Profil
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
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
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
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
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
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
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
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
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
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
Zřejmě to tím opravdu bude, mb_substr neznám, děkuji za něj :)
Mufna
Profil
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

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: