Rozdělení dlouhých slov

Saturday 9.6.2012 12:58:43, Jakuje

Kategorie: Programování | PHP

Řešení existuje několik. Nejjednodušší je použít vestavěnou funkci PHP wordwrap, která rozdělí řetězec na několik řádků a dlouhá slova také rozdělí zadaným znakem. Ale toto řešení mi přijde zbytečně složité a proto jsem se podíval po něčem jednodušším.

Ano. K nalezení dlouhého slova a jeho rozdělení lze použít regulární výraz. V PHP zapsaný takto:

Zdrojový kód:
preg_replace('/([a-zA-Z]{25})(?![^a-zA-Z])/', '$1 ', $variable);

Jedná se o jednoduché nalezení 25 znaků abecedy (lze omezit na jiné znaky, rozšířit o české znaky, nebo brát vše kromě bílých znaků – [^s] ), za kterými následuje další takovýto znak. Těchto 25 znaků přepsat a za ně umístit znak mezery (v další části se zmíním ještě o dalších možnostech oddělovačů). Jednoduché a elegantní řešení na jeden řádek.

Ale toto řešení může mít problém, pokud takto začneme dělit smysluplná slova, která poztrácejí význam. Stejně tak je problém, pokud je dělení příliš přísné a oddělí se třeba jen poslední znak, který se nakonec ve stránce zobrazí na stejném řádku. Řešení opět existuje a je jím Unicode znak 200b – výstižně pojmenovaný Zero width space – mezera nulové šířky, který se pro tuto aplikaci přesně hodí. Dle názvu se opravdu jedná o mezeru a tudíž ji prohlížeč rád zalomí, ale pokud k zalomení nedojde, jednotlivé části slova budou tvořit vzhledově slovo jediné.

Jediným problémem může být vyhledávání v prohlížeči, takto rozdělených slov. Google chrome takto rozdělená slova zvládá bez problémů, ale ostatní takto rozdělená slova nenajdou.

Výsledný řádek kódu, který tedy používám vypadá takto:

Zdrojový kód:
preg_replace('/([^s]{6})(?![s])/', '$1​', $variable);

Vložení Zero Width Space za každých 6 znaků, které jsou nedělitelné, jednoho dělitelného pro zalomení.

Diskuse:

:
:
:

 
    

Podbarvená pole označená hvězdičkou jsou povinná!