Autor Zpráva
Myšák
Profil *
Mohl by mě někdo nakopnout, jakým stylem a funkcemi mám udělat následující? Mám kus textu, ve kterém hledám konkrétní slovo a potřebuju to slovo najít a uříznout jej tak aby bylo 50 znaků před slovem, dané slovo a 50 znaků po něm.
Chro.
Profil
Funkcí strpos si zjisti polohu slova od začátku a pak substr vyjmi řetězec od polohy -50 zjištenou strpos + strlen slova + dalších 50 znaků. Doporučuji používat funkce z rodiny mb_* jako mb_strpos, mb_strlen a mb_substr.
juriad
Profil
$text = 'text obsahující slovo někde uprostřed';
$slovo = 'slovo';

$where = mb_strpos($text, $slovo);
$a = max(0, $where - 5);
$l = mb_strlen($slovo) + 10;

echo mb_substr($a, $l);
A samozřejmě hromada podmínek okolo, ale na to snad přijdeš.
Myšák
Profil *
JJ zvládnu, děkuju.
kzk_cz
Profil *
Nebo můžeš použít jednodušší variantu.

mb_strstr
RASik
Profil *
Chro.:
Prosím, proč je lepší používat rodinu mb_....? Z návodu nejsem nijak moudrý (anglina není moje hobby).
lionel messi
Profil
RASik:
Prosím, proč je lepší používat rodinu mb_....?
Prefix mb_ je odvodený od multi byte, čiže ide o funkcie vhodné pre prácu s multibajtovými kódovaniami (napr. bežne používaným UTF-8, kt. kóduje mnohé znaky — napr. diakritiku — v dvoch bajtoch (a niektoré znaky tuším až štyrmi bajtmi)). Napríklad funkcia strlen v skutočnosti nepočíta znaky, ale bajty (pri jednobajtovom kódovaní ide o zhodné číslo), čo sa prejaví pri použití UTF-8. Pri orezávaní môžeš zase zápasiť s rozbitou diakritikou (kedysi na to juriad vytvoril fantastickú ukážku, neviem ju dohľadať, ale dobre to ilustruje xROAL [#9]).
Juraj Hajdúch
Profil
RASik:
Prefix mb znamená multibyte; sú to funkcie pracujúce s textom; jednotlivé alfanumerické znaky môžu v rôznych kódovaniach (napr utf-8) zaberať rôzny počet bytov. Tieto funkcie sú práve určené na bezpečnú prácu s reťazcami.

V samotnej dokumentácii PHP sa píše, že táto problematika je nad rámec samotnej dokumentácie a odkazuje na
www.unicode.org/.
xROAL
Profil
RASik:
[#7] lionel messi a [#8] Juraj Hajdúch ma už predbehli s vysvetlením, ale mal som tu už pripravenú ukážku kódu, ako by sa prejavilo použitie bežných (teda nie multi byte) funkcií pri práci s multi byte kódovaním:
<?php
  $mbChar = "€";
  echo strlen($mbChar);  // vypíše 3 - čo je počet bajtov znaku € v UTF-8
  echo mb_strlen($mbChar); // vypíše správne 1, nakoľko v skutočnosti máme len jeden UTF-8 znak
?>
Juraj Hajdúch
Profil
xROAL:
Pekné, to vysvetľuje všetko. Len by som dodal, že u mb funkcií je možné aj deklarovať vlastné kódovanie ako nepovinný argument.
juriad
Profil
Jedná se o ukázku: substr vs. mb_substr - délka řetězce
RASik
Profil *
Díky všem, to tedy zírám, nikdy jsem na žádný problém se strlen apod. nenarazil...

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: