Blog

Jeszcze o stringach – dzielenie wyrazów

Stringi to niewątpliwie atrakcyjny temat, więc chciałbym jeszcze zatrzymać się przy tym temacie. Ostatnim razem podzieliłem się wynikami swoich prób z usuwaniem długich wyrazów z tekstu, aby nie rujnował on układu strony.

Wspomniałem przy tym o funkcji wordwrap ze Smarty. Przyszło mi do głowy, by połączyć swoje wyrażenie regularne i tę funkcję. Przecież zamiast skracać, lepiej dzielić ciągi na mniejsze. Dokładnie tak, jak robi się to, pisząc ręcznie – dodajemy na końcu łącznik i przechodzimy do nowego wiersza. Korzystając z wyrażeń regularnych, można stworzyć coś w rodzaju wordwrap na sterydach – funkcja łamie tylko tekst widoczny na stronie, a długie wartości atrybutów XHTML zostawia w spokoju. Po modyfikacji filtr wygląda w taki sposób:

preg_replace ('/(?<=s|>)([^"'s<>]{59,})(?=s|<)/e', 'substr(chunk_split("$1", 57, "- "), 0, -2)', $tpl_output); 

Wyłapuje on ciągi o długości 59 znaków (wartość dostosowana do szerokości strony), a potem co 57 znaków dodaje myślnik i spację. Po natrafieniu na biały znak, przeglądarka sama przełamuje tekst, oczywiście o ile nie jest on wewnątrz znacznika <pre>. Funkcja substr() jest dodana po to, by usunąć myślnik i spację z końca stringa zwróconego przez chunk_split(). Myślę że takie filtrowanie można już bez obaw zastosować przed zapisem tekstu w bazie danych. Jeśli nawet trzeba będzie odzyskać oryginalny, długi łańcuch, nie powinno być z problemów.

Oczywiście nie ma rozwiązań doskonałych. Wadą tego jest bezmyślność. W naszym pięknym języku dzielenie wyrazów jest obwarowane sporą ilością zasad. Należałoby więc stworzyć parser, który dzieli wyrazy według sylab, rozbija sekwencje tych samych liter, czy nie dzieli po myślnikach, które już znajdują się w danym ciągu znaków.

Myślę, że to niezły pomysł na większy skrypt. Parser, który możliwie inteligentnie dzieli wyrazy. Przydałoby się też dodanie kilku opcji dla fanów poprawnej typografii: np. skrypt mógłby zastępować nadużywane przez wszystkich cudzysłowy (” “) ich właściwymi, polskimi odpowiednikami („ ”), odróżniać myślnik od łącznika, itd…

Co ciekawe, podobny skrypt już powstał. To plugin dla Movable Type o nazwie Smarty Pants. Niestety, nie jest dostosowany do specyfiki polszczyzny, no i przede wszystkim nie jest napisany w PHP, tylko w Perlu! [Ależ rasistowski jest podtekst poprzedniego zdania.]

Jeśli ktoś zdecyduje się na napisanie tego rodzaju skryptu, proszę o kontakt, abyśmy mogli ustalić należną mi część zysków za podsunięcie pomysłu :).

Comments

  1. Cezary Okupski

    W mojej praktyce nie okazało się to dobrym wyjściem, ale warto być świadomym.

Comments are now closed