Jakiś czas temu, na forum 4programmers.net przewinął się temat skracania tekstu. Temat o tyle skomplikowany, że chodziło o skrócenie głównej treści artykułu, zostawiając w nim wszystkie znaczniki. Problemy tutaj są dwa (podstawowe):
- dbanie o nieucinanie znaczników, żeby każdy rozpoczęty był we właściwej kolejności zakończony
- skracanie tekstu tak, żeby długość widocznego tekstu nie była skracana o tekst znaczników
W przytoczonym wątku problemem są tagi BBCode, które mogą mieć różne formy:
[tag]treść[/tag]
[tag=coś]treść[/tag]
[tag]
Trzeba pamiętać (na co mi zwrócono uwagę w przytoczonym wątku), że w takim np. tagu [url] może być zawarty adres URL, który nie może zostać ucięty. Skrócony może zostać tylko i wyłącznie tekst zawarty między znacznikiem rozpoczynającym a kończącym.
Sposób, na jaki wpadłem, opierał się na rozbiciu tekstu na poszczególne części za pomoca preg_split, i późniejszej obróbki powstałej w ten sposób tablicy. Po ominięciu pewnych trudności z kombinacjami takimi jak:
[url][img=aa]coś coś[/img][/url]
skonstruowałem funkcję, której można użyć do tego celu.
Jeśli komuś mogłaby się ona przydać (a myślę że więcej osób może mieć tego typu problem), to zapraszam do skorzystania z gotowca :).
W przypadku, gdy ktoś nie korzysta z BBCode’u, można użyć do tego celu parsera XML (zakładam korzystanie z XHTML raczej, niż HTML). Dodałem podobną funkcjonalność do mojej klasy mParser, która docelowo służy do filtrowania w tekście pobranym od użytkownika niebezpiecznych danych.