Autor Zpráva
wise
Profil
Zdravím,

pokud mám např. string "žluťoučký koníček měl rád smetanu"

a použiji mb_substr($string, 0, 12), výsledek je např: "žluťoučký kon";

Jaký mám problém ve fci, která mi zkrátí slovo, jakmile najde "." nebo " "?
Resp. aby výsledek byl: "žluťoučký koníček".

//@param string text, který upravuji
//@param int odkdy mám zkracovat
//@param int délka, na kterou zkracuji
//@param string kódování, které použít
function my_substr($text, $start, $lenght, $charset = 'utf-8'){

  $good_end = array(" ", ".", " ");

  for($i = $lenght; $i < mb_strlen($text, $charset) + 1; $i++){
  
    if(in_array($text[$i], $good_end)) 
      return mb_substr($text, $start, $i, $charset);

  }
  return mb_substr($text, $start, $lenght, $charset);
}
Alphard
Profil
Hmm, přiznám se, že jsem se do toho docela zamotal. Problém je zřejmě v rozpoznávání znaků, nejsem si jist.
Začal přemýšlet o jiném způsobu, vzpomněl jsem si na reguláry, na první pokus jsem sestavil tohle a fungovalo :-)

$string = "žluťoučký koníček měl rád smetanu";
preg_match('~(.{12}[^. ]+)~u', $string, $mtch);
print_r($mtch);

výsledek
Array ( [0] => žluťoučký koníček [1] => žluťoučký koníček )

Pak jsem se rozhodl podívat, jak to dělají jinde. První věc, kam jsem nakoukl, bylo Nette, a mají to tam úplně stejně :-)
http://github.com/nette/nette/blob/master/Nette/Utils/String.php#L166
Jen ten regulár je trochu promyšlenější, tak se kdyžtak inspirujte.
wise
Profil
Máte pravdu, s regulárem to funguje, nicméně mě to ochuzuje o možnost definovat, $start. Pokud bych například chtěl brát například nějaký úryvek.

Nějak to ale preci musí jít tou mou funkcí. Několikrát jsem ji přepisoval a hledal chybu, ale stále nemohu žádnou najít.

Prozatím si ponechám regulár, děkuji moc a časem se k tomu vrátím a snad budu moudřejší :)
wise
Profil
Teď jsem se znova pořádně podíval na výsledek a zdá se, že asi ještě neponechám :) S regulárama moc neumím, takže v tomto případě s tím nehnu, nicméně je tu problém. Jakmile je string kratší než daná délka zkrácení, text to vůbec neukáže :)
Alphard
Profil
[#4] wise
Ten regulár řeší hlavní problém, zbytek lze dořešit podmínkami, jak jste to měl.
1. pro úryvek: mb_substr() vybere od začátek úryvku s dostatečnou zálohou na konci, regulár to ořízne
2. když mb_strlen() zjistí délku menší, než požadovanou, vrátí se celý řetězec
wise
Profil
Taková banalitka a to mě nanapadlo :) Díky

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:

0