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):

  1. dbanie o nieucinanie znaczników, żeby każdy rozpoczęty był we właściwej kolejności zakończony
  2. 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 (klasa dostępna w pakiecie mPack).

UPDATE:

Zaktualizowałem linki.


A Ty? Co o tym myślisz?

Możesz używać w komentarzach następujących znaczników:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Sblam! Antyspam