headerbanner

Zkrácení dlouhých řádků regulárním výrazem

Dobré studijní texty umožňující i dost složitou práci s regulárními výrazy obsahují například výrazy pro odstranění duplicitních slov a mnoho dalších užitečných vzorů. Tady je jeden další, který by se mohl hodit:

 
$str='ertyu iopa sdf ghjkl zxcvbnm a ertyuo 12356 78 ertyuiop';
$pattern='~(.{12,20}\s)~';
$replacement='\\1<br>';
echo preg_replace($pattern, $replacement,$str);
 

Uvedený vzor vkládá do mezery na pozici 13 až 21 znaku HTML tag pro označení konce řádku. Zkracuje a ukončuje řádek správně v mezeře.

Vzor $pattern je narozdíl od obvyklého způsobu zarámován tildou ~ místo lomítka /. Tilda se v žádném řetězci běžně nevyskytuje a jako ohraničující znak je tedy vhodnější (podle mého soudu). Základem vzoru je opakování jakýchkoli znaků nejméně 12x a max. 20x - tato čísla tvoří hranice rozdělení (vhodnější je kvůli delším slovům spíš větší tolerance, například {30,42}).

Za skupinou znaků, které zůstanou na jednom řádku, je mezera (\s - jakýkoli prázdný znak), tedy mezera mezi slovy. Celý výraz je vložen do závorek, takže tvoří subvýraz. Na něj se pak odkazuje $replacement v podobě sekvence \\1 (možné použít i $1). Subřetězec odpovídající subvýrazu je tedy nahrazen sebou samým a k tomu je přidán tag BR. Výsledek uvedeného může být třeba následující:

Drůbeží vývar s masem a nudlemi10Kč

Smažený kuřecí řízek s domácím bramborovým
salátem80Kč

Salát z čerstvé zeleniny s kuřecím masem (100 g), grilovaná
slanina, volské oko, bazalkové pesto, čerstvá bagetka90Kč