Autor Zpráva
drozdo
Profil
Dobry den,
Potreboval by som pomoc s orezanim retazca.

Konkretne mam retazce:
string1....... skjlf skj dflsbflbkljbsldkjb aaa
string2 .... jsldgisfgsidfghgf aaaaa

Potrebujem aby sa orezali po 15-tom znaku, a zaroven pred najblizsou medzerou:

cize vypisalo by mi:
string1 ... skjlf skj dflsbflbkljbsldkjb
string ... jsldgisfgsidfghgf
mckay
Profil
drozdo:
Když by si to zkombinoval s regulárním výrazem, můžeš použít funkci substr();.

Použij to takto:
$promenna = substr($promenna, 0,15);

Ale zkombinuj to s regulárem, kterej ti vyhledá nejbližší mezeru po patnáctém znaku. Možná mě tak napadá, že potom bude snažší to řešit celé regulárem.
AM_
Profil
Na to PHP přímo funkci nemá. Pro oříznutí po určitém znaku slouží substr, napsáním vlastní funkce s použitím této v kombinaci se strpos nebo možná ještě lépe vhodným regulárním výrazem lze takovou funkci vytvořit. Např:
$text = preg_replace('~(.{15}[^\\s]*)~is', '\\1<br>', $text);
lingvik
Profil
function orez($length, $what) {
  // Vrati cely retezec, pokud neni dost dlouhy
  if (strlen($what) < $length) {
    return $what;
  }
  
  // Zjistim, kde je nejblizsi mezera za stanovenym poctem znaku
  $pos = strpos($what, ' ', $length - 1);
  if ($pos === false) {
    // Od mista orezani az do konce neni zadna mezera. Vysledkem je zase cely retezec.
    return $what;
  }
  
  // Vratim podretezec od zacatku po nalezenou mezeru
  return substr($what, 0, $pos);
}


V této implementaci je možné, že výsledný řetězec bude mít pouze 14 znaků, pokud je patnáctým znakem mezera. Pokud pracuješ v kódování UTF-8 nebo něčem podobném multibytovém, používej funkce mb_strlen(), mb_strpos() a mb_substr().

EDIT: oprava v řádku č.15 jako reakce na #7. Přehlédl jsem, že třetí parametr pro substr není pozice posledního znaku, ale délka podřetězce. Ta -1 tam byla špatně.
drozdo
Profil
Dobre napady, co by ste povedali na moju funkciu, trocha pritiahnuta za vlasy, ale robi co ma:

function orez($popisn) {
          if(strlen($popisn)>15) {
            $mezera = strpos(substr($popisn,15)," "); 
            $popisall = substr($popisn,0,15);
            $popisall .= substr($popisn,15,$mezera);
            return $popisall;
          }
          else { 
         return $popisn;
          }
}


Ked tak kritiku >|, dakujem
SwimX
Profil
drozdo:
1)
$popisall = substr($popisn,0,15);
            $popisall .= substr($popisn,15,$mezera);
todle jde sloučit do jednoho řádku

a neřešíš když se mezera nenajde, protože pak strpos vrátí false takže řádek $popisall .= substr($popisn,15,$mezera); asi hodí chybu.

Použíj tudle: #4 Je velmi obdobná, jen vychytaná :)
drozdo
Profil
Ano dobre, hoci ta funkcia so 4 mi oreze vzdy posledne pismeno

edit dal som prec pri retrun (-1) a neorezava, dakujem
SwimX
Profil
drozdo:
eště si můžeš upravit první řádek:
function orez($what, $length=15) {
abys nemusel pořád volal s 15, ale přesto měl možnost si zadat jinou délku.
drozdo
Profil
Ano vim dakujem, tu 15ku som dal len ako priklad, volat bude samozrejme hocicim inym.

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: