Простой типограф на PHP
Наверное это самый простой типограф из всех существующих, в нём не хватает многих возможностей, но это легко добавить самостоятельно. Самое главное, что он умеет, это расставлять вложенные кавычки.
- "Расставляются кавычки "ёлочки", причем кавычки могут быть "вложенными"."
- Длинное тире - вместо знака "минус".
- Непереносимый пробел (
) после коротких слов. - Символ многоточия
…
заменяется на три точки... (ибо нефиг)
Работает только с UTF-8 строками, и результат выдаёт в этой же кодировке. Если вы ещё используете однобайтовые кодировки, то похоже что вы проспали 10 лет, уже 21 век на дворе. Советую потратить усилия, и отказаться от архаичных кодировок в своих разработках, переходите на юникод.
Исходный код:
<?php
function typograph($text) {
$text = html_entity_decode($text, ENT_QUOTES, 'utf-8');
$arr = array(
// Убираем символ троеточия
'/…/u' => '...',
// Кавычки «ёлочки» « »
'/(^|[\s;\(\[-])"/' => '$1«',
'/"([\s-\.!,:;\?\)\]\n\r]|$)/' => '»$1',
'/([^\s])"([^\s])/' => '$1»$2',
// Длинное тире —
'/(^|\n|["„«])--?(\s)/u' => '$1—$2',
'/(\s)--?(\s)/' => ' —$2',
// Непереносимый проблел после коротких слов
'/([\s][a-zа-яё]{1,2})[ ]/iu' => '$1 '
);
foreach ($arr as $key=>$val) {
$text = preg_replace($key, $val, $text);
}
// Вложенные кавычки „ “
while (preg_match('/(«[^«»]*)«/mu', $text)) {
$text = preg_replace('/(«[^«»]*)«/mu', '$1„', $text);
$text = preg_replace('/(„[^„“«»]*)»/mu', '$1“', $text);
}
return $text;
}