Простой типограф на PHP

Наверное это самый простой типограф из всех существующих, в нём не хватает многих возможностей, но это легко добавить самостоятельно. Самое главное, что он умеет, это расставлять вложенные кавычки.

  • "Расставляются кавычки "ёлочки", причем кавычки могут быть "вложенными"."
  • Длинное тире - вместо знака "минус".
  • Непереносимый пробел ( ) после коротких слов.
  • Символ многоточия заменяется на три точки... (ибо нефиг)

Работает только с UTF-8 строками, и результат выдаёт в этой же кодировке. Если вы ещё используете однобайтовые кодировки, то похоже что вы проспали 10 лет, уже 21 век на дворе. Советую потратить усилия, и отказаться от архаичных кодировок в своих разработках, переходите на юникод.

Исходный код:

<?php
function typograph($text) {
    $text = html_entity_decode($text, ENT_QUOTES, 'utf-8');
    $arr = array(
        // Убираем символ троеточия
        '/…/u' => '...',
        // Кавычки «ёлочки» &laquo; &raquo;
        '/(^|[\s;\(\[-])"/' => '$1«',
        '/"([\s-\.!,:;\?\)\]\n\r]|$)/' => '»$1',
        '/([^\s])"([^\s])/' => '$1»$2',
        // Длинное тире &mdash;
        '/(^|\n|["„«])--?(\s)/u' => '$1—$2',
        '/(\s)--?(\s)/' => ' —$2',
        // Непереносимый проблел после коротких слов &nbsp;
        '/([\s][a-zа-яё]{1,2})[ ]/iu' => '$1 '
    );
    foreach ($arr as $key=>$val) {
        $text = preg_replace($key, $val, $text);
    }
    // Вложенные кавычки &bdquo; &ldquo;
    while (preg_match('/(«[^«»]*)«/mu', $text)) {
        $text = preg_replace('/(«[^«»]*)«/mu', '$1„', $text);
        $text = preg_replace('/(„[^„“«»]*)»/mu', '$1“', $text);
    }
    return $text;
}
02 июня 2012