Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > создание типографа для utf 8


Автор: americanets 19.8.2007, 15:10
хочу сделать типограф на PHP 4 чтоб мог работать и в utf 8 
пока сделал небольшую функцию, но это не совсем то 

Код

<?php
setlocale(LC_ALL, 'ru_RU.UTF-8', 'rus');
function typo($str){
$zamena = array();
$zamena = array(
        '&gt;&gt;' => '&raquo;',
        '&lt;&lt;' => '&laquo;',
        '1/2' => '&frac12;',
        '1/4' => '&frac14;',
        '3/4' => '&frac34;',
        '...'  => '&hellip;',
        '&lt;--' => '&larr;',
        '--&gt;' => '&rarr;',
        '+-'=>'&plusmn;',
        '(c)'=>'&copy;',
        '--'=>'&mdash;',
        '(TM)'=>'&trade;',
        );
    $str = strtr($str, $zamena);
    return $str;
}
?>


хотя кое что заменяет нормально, как можно реализовать чтоб функция могла определить когда ставить кавычки (для русского языка) а когда "лапки" для английского и соответственно открывала их и закрывала ? 

Автор: Glip 19.8.2007, 15:26
http://www.onphp.org/doxy/0.10.0/dd/dba/classRussianTypograph.html
может быть тут найдёте что-то полезное.

Автор: americanets 19.8.2007, 16:27
он вроде на 5 посмотрю как там

Автор: americanets 19.8.2007, 19:10
c одиночным английским словом справляется нормально если не одно слово то парит, берет первую и последнии кавычку, с русским текстом вообще труба, только первую кавычку меняет и тоже только когда одно слово, в тексте не может 

Код

$text = preg_replace( "/(^|\s|\201|\200|>)\&quot;([0-9A-Za-z\'\!\s\.\?\,\-\&\;\:\_\200\201]+(\&quot;|”))/i", "\\1“\\2", $text );
$text = preg_replace( "/(\&\#147\;([A-Za-z0-9\'\!\s\.\?\,\-\&\;\:\200\201\_]*).*[A-Za-z0-9][\200\201\?\.\!\,]*)\&quot;/i", "\\1”", $text);

$text = preg_replace( "/\"\"/i", "&quot;&quot;", $text );
$text = preg_replace( "/(^|\s|\201|\200|>|\()\&quot;((\201|\200)*[~0-9ёЁA-Za-zА-Яа-я\-:\/\.])/i", "\\1&laquo;\\2", $text );
$text = preg_replace( "/(^|\s|\201|\200|>|\()\&quot;((\201|\200|\/&nbsp;|\/|\!)*[~0-9ёЁA-Za-zА-Яа-я\-:\/\.])/i", "\\1&laquo;\\2", $text );

$text = preg_replace( "/(\&laquo\;([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/](\201|\200)*)\&quot;/i", "\\1&raquo;", $text );
$text = preg_replace( "/(\&laquo\;([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/](\201|\200)*\?(\201|\200)*)\&quot;/i", "\\1&raquo;", $text );
$text = preg_replace( "/(\&laquo\;([^\"]*)[ёЁA-Za-zА-Яа-я0-9\.\-:\/](\201|\200|\/|\!)*)\&quot;/i", "\\1&raquo;", $text );

Автор: SamDark 20.8.2007, 12:32
americanets, 
Какие-то очень длинные регулярки... может упростить?

p.s. вот ещё можно глянуть типограф, который я потихоньку дорабатываю:
http://rmcreative.ru/article/programming/typograph/

Автор: GiV 20.8.2007, 12:53
На сколько помню для работы PCRE добавлять модификатор /u
Либо отказаться от PCRE и использовать POSIX RegEx с multibyte (http://ru2.php.net/manual/ru/ref.mbstring.php)

Но до использования mb_ereg* громко сказать:
Код

mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');

Автор: americanets 20.8.2007, 20:17
спасибо  вроде разобрался
Код

$m = preg_replace( "/\"\"/i", "&quot;&quot;", $m );
      $m = preg_replace( "/\"\.\"/i", "&quot;.&quot;", $m );
      $_data = "\"\"";
      while ($_data != $m)
      {  
        $_data = $m;
        $m = preg_replace( "/(^|\s|\201|\200|>)\&quot;([0-9A-Za-z\'\!\s\.\?\,\-\&\;\:\_\200\201]+(\&quot;|”))/i", "\\1“\\2", $m);
$m = preg_replace( "/(\&\#147\;([A-Za-z0-9\'\!\s\.\?\,\-\&\;\:\200\201\_]*).*[A-Za-z0-9][\200\201\?\.\!\,]*)\&quot;/i", "\\1”", $m);
      }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)