Autor | Zpráva | ||
---|---|---|---|
wise Profil |
#1 · Zasláno: 22. 7. 2010, 17:39:53 · Upravil/a: wise
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 |
#2 · Zasláno: 22. 7. 2010, 23:21:59
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 |
#3 · Zasláno: 22. 7. 2010, 23:49:15
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 |
#4 · Zasláno: 22. 7. 2010, 23:51:19
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 |
#5 · Zasláno: 22. 7. 2010, 23:58:10
[#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 |
#6 · Zasláno: 23. 7. 2010, 00:00:31
Taková banalitka a to mě nanapadlo :) Díky
|
||
Časová prodleva: 15 let
|
0