Forum Webscript.Ru

Программирование => PHP => Тема начата: stanlee от 25 Мая 2004, 10:39:33

Название: замена кавычек на елочки
Отправлено: stanlee от 25 Мая 2004, 10:39:33
Здравствуйте.
У меня проблемка не могу нормально заменить кавычки на елочки
где то вычетал что это осуществляется так
справа ^str.match[(\\b(?:[.,!?])?)"][g]{${match.1}»^;}
слева ^str.match["(\\b)][g]{«^;$match.1}

но я чет не въеду - тут как то заумно написано - как это в коде то реализовать?
Название: замена кавычек на елочки
Отправлено: ThE0ReTiC от 25 Мая 2004, 10:59:51

define("TAG1","\\xAC");
define("TAG2","\\xAD");
define("LAQUO","«");
define("RAQUO","»");
define("LDQUO","«");
define("RDQUO","»");
define("MDASH","\\x97");
define("NDASH","\\x96");
define("APOS","\\xB4");
define("HELLIP","\\x85");

$Refs = array();
$RefsCntr = 0;
class CString
{
var $Stream;
var $OutStream;
function CString()
{
global $Refs,$RefsCntr;
$Refs = array(); // буфер для хранения тегов
$RefsCntr = 0;   // счётчик буфера

}

function szCleanHTML($x)
{
global $Refs,$RefsCntr;
    $Refs[] = StripSlashes($x[0]);
    return TAG1.($RefsCntr++).TAG2;
}
function szRetHTML($x)
{
global $Refs,$RefsCntr;
    return $Refs[$x[1]];
}

function szTypograf($text,$isHTML = true)
{
global $Refs,$RefsCntr;
    if($isHTML)
    {
       

        // комментарии
        $text = preg_replace_callback(\'{}s\', array($this,\'szCleanHTML\'), $text);
        $PrivateTags = "title|script|style|pre|textarea";
        $text = preg_replace_callback(\'{<\\s*(\'.$PrivateTags.\')[\\s>].*?<\\s*/\\s*\\1\\s*>}is\',array($this,\'szCleanHTML\'), $text);

        // обычные теги
        $text = preg_replace_callback(\'{<(?:[^\\\'"\\>]+|".*?"|\\\'.*?\\\')+>}s\',array($this,\'szCleanHTML\'),$text);
    }

 

    $prequote = \'\\\\s\\\\(\\\\[\\\\{";-\';
    $text = preg_replace(\'{^"}\', LAQUO, $text);
    $text = preg_replace(\'{(?<=[\'.$prequote.\'])"}\', LAQUO, $text);

    // а это для тех, кто нарушает ВЕЛИКОЕ ПРАВИЛО
    $text = preg_replace(\'{^((?:\'.TAG1.\'\\d+\'.TAG2.\')+)"}\', \'\\1\'.LAQUO, $text);
    $text = preg_replace(\'{(?<=[\'.$prequote.\'])((?:\'.TAG1.\'\\d+\'.TAG2.\')+)"}\', \'\\1\'.LAQUO, $text);



    $text = str_replace(\'"\', RAQUO, $text);


    $text = preg_replace(\'{\'.LAQUO.RAQUO.\'}\', LAQUO.LAQUO, $text);
    $text = preg_replace(\'{\'.RAQUO.LAQUO.\'}\', RAQUO.RAQUO, $text);

    //    вложенные кавыки
    $i=0; // - это защита от зацикливания (оно возможно в случае неправильно расставленных кавычек)
    while (($i++<10) && preg_match(\'{\'.LAQUO.\'(?:[^\'.RAQUO.\']*?)\'.LAQUO.\'}\', $text))
        $text = preg_replace(
            \'{\'.LAQUO.\'([^\'.RAQUO.\']*?)\'.LAQUO.\'(.*?)\'.RAQUO.\'}s\',
            LAQUO.\'\\1\'.LDQUO.\'\\2\'.RDQUO, $text);

    $i=0;
    while (($i++<10) && preg_match(\'{\'.RAQUO.\'(?:[^\'.LAQUO.\']*?)\'.RAQUO.\'}\', $text))
        $text = preg_replace(
            \'{\'.RAQUO.\'([^\'.LAQUO.\']*?)\'.RAQUO.\'}\',
            RDQUO.\'\\1\'.RAQUO, $text);


    $text = preg_replace(\'{^-+(?=\\s)}\',MDASH,$text);
    $text = preg_replace(\'{(?<=[\\s\'.TAG2.\'])-+(?=\\s)}\',MDASH,$text);
    $text = str_replace(\' \'.MDASH,\' \'.MDASH,$text);
    // ndash:
    $text = preg_replace(\'{(?<=\\d)-(?=\\d)}\',NDASH,$text);
    // ...:
    $text = str_replace(\'...\',HELLIP,$text);
    // апостроф:
    $text = preg_replace(\'{(?<=\\S)\\\'}\',APOS,$text);


    if($isHTML)
    {
        // возвращаем взятое обратно
        while (preg_match(\'{\'.TAG1.\'.+?\'.TAG2.\'}\', $text))
            $text = preg_replace_callback(\'{\'.TAG1.\'(.+?)\'.TAG2.\'}\', array($this,\'szRetHTML\'), $text);
       
    }


    $text = str_replace(
        array(LAQUO,RAQUO,LDQUO,RDQUO,MDASH,NDASH,HELLIP,APOS),
        array(\'«\',\'»\',\'„\',\'“\',\'—\',\'–\',\'…\',\'’\'),
        $text
    );
    return $text;
}
} // }}  CString
Название: замена кавычек на елочки
Отправлено: stanlee от 25 Мая 2004, 11:00:53
нифигово!
а что тока так - покороче код нельзя сделать?
Название: замена кавычек на елочки
Отправлено: ThE0ReTiC от 25 Мая 2004, 11:02:23
можно.
как-нить сам.
мне покороче не нужно.
тока он слеши хад порезал.
Название: замена кавычек на елочки
Отправлено: ThE0ReTiC от 25 Мая 2004, 11:07:41
собно это переработанное в класс
http://hiero.ru/david/typographer.php
так как предидущая версия не совсем корректно обрабатывала HTML и перестала удовлетворять.
Название: замена кавычек на елочки
Отправлено: stanlee от 25 Мая 2004, 11:10:13
Да но то что я привел - хз отекуда.
там все в одну строку выражено - тока на каком языке это я не знаю - предпологаю перл.
Название: замена кавычек на елочки
Отправлено: Меняздесьдавнонет от 25 Мая 2004, 11:15:28
stanlee
если ты хочешь делать по-человечески, заменять не только "елочки" и НЕ заменять внутри  хтмл тегов, то двумя строчками не обойдешься.
в противном случае вообще забудь о своем вопросе.

вот тебе еще одна
http://textus.ru/freeware/kavychker

и хватит вертеть носом.
Название: замена кавычек на елочки
Отправлено: stanlee от 25 Мая 2004, 11:40:08
А как этот класс вызыват то? :)
Название: замена кавычек на елочки
Отправлено: ThE0ReTiC от 25 Мая 2004, 11:46:47
stanlee
http://www.php.net
читаем доку
Название: замена кавычек на елочки
Отправлено: stanlee от 25 Мая 2004, 11:49:02
да дока мне не поможет я с классами и регулярками ужиться ну не могу и все - регулярку я еще кое как понимаю но классы почему то не могу понять - че за хрень, поэтому по жизни я пытаюсь классы обходить
Название: замена кавычек на елочки
Отправлено: ThE0ReTiC от 25 Мая 2004, 11:53:54
stanlee
тогда переписывай.
Название: замена кавычек на елочки
Отправлено: stanlee от 25 Мая 2004, 11:56:26
:)
ну я попробовал
$CString = new CString;
$CString -> CString("ля ля ля");
если конечно правильно - ничего не вернулось
и еще ругается пехепе что ошибка
тут
$text = preg_replace_callback(\'{<(?:[^\'">]+|".*?"|\'.*?\')+>}s\', array($this, \'szCleanHTML\'), $text);
и тут
$text = preg_replace(\'{(?<=S)\'}\', APOS, $text);
???
Название: замена кавычек на елочки
Отправлено: ThE0ReTiC от 25 Мая 2004, 12:37:16
stanlee
ну и неправильно пробовал
потом я написал, что форум слеши порезал.
Название: замена кавычек на елочки
Отправлено: stanlee от 25 Мая 2004, 12:47:38
а как правильно ? :(
Название: замена кавычек на елочки
Отправлено: CGVictor от 25 Мая 2004, 13:04:50
ThE0ReTiC
Я так понял, основная функция у hiero.ru/david - TypoAll с передачей строки текста?

Цитировать
как предыдущая версия не совсем корректно обрабатывала HTML и перестала удовлетворять

А подробнее???
Название: замена кавычек на елочки
Отправлено: ThE0ReTiC от 25 Мая 2004, 13:15:27
CGVictor
да
здесь это
$obNamej->szTypograf($string)

подробнее - она была написана совсем по другому - там был больший функционал, но правильно обрабатывался только plain text
кавычки в HTML обрабатывали некорректно (не все пропускались)
Название: замена кавычек на елочки
Отправлено: CGVictor от 25 Мая 2004, 13:21:57
ThE0ReTiC
А можно (пальцем) это место в вышеприведенном коде? А то чего-то отличий не заметно... Или плохо смотрю...
Название: замена кавычек на елочки
Отправлено: ThE0ReTiC от 25 Мая 2004, 13:27:51
CGVictor
ты не понял.
это моя предидущая версия перестала меня устраивать
приведенный код - классовая обертка к тому, что я дал по ссылке.
все.
реализация
http://hiero.ru/david/typographer.php
в виде класса
Название: замена кавычек на елочки
Отправлено: CGVictor от 25 Мая 2004, 14:09:22
ThE0ReTiC
Ааа! Ну всё, ясно! Спасибо!