Forum Webscript.Ru
Программирование => PHP => Тема начата: stanlee от 25 Мая 2004, 10:39:33
-
Здравствуйте.
У меня проблемка не могу нормально заменить кавычки на елочки
где то вычетал что это осуществляется так
справа ^str.match[(\\b(?:[.,!?])?)"][g]{${match.1}»^;}
слева ^str.match["(\\b)][g]{«^;$match.1}
но я чет не въеду - тут как то заумно написано - как это в коде то реализовать?
-
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
-
нифигово!
а что тока так - покороче код нельзя сделать?
-
можно.
как-нить сам.
мне покороче не нужно.
тока он слеши хад порезал.
-
собно это переработанное в класс
http://hiero.ru/david/typographer.php
так как предидущая версия не совсем корректно обрабатывала HTML и перестала удовлетворять.
-
Да но то что я привел - хз отекуда.
там все в одну строку выражено - тока на каком языке это я не знаю - предпологаю перл.
-
stanlee
если ты хочешь делать по-человечески, заменять не только "елочки" и НЕ заменять внутри хтмл тегов, то двумя строчками не обойдешься.
в противном случае вообще забудь о своем вопросе.
вот тебе еще одна
http://textus.ru/freeware/kavychker
и хватит вертеть носом.
-
А как этот класс вызыват то? :)
-
stanlee
http://www.php.net
читаем доку
-
да дока мне не поможет я с классами и регулярками ужиться ну не могу и все - регулярку я еще кое как понимаю но классы почему то не могу понять - че за хрень, поэтому по жизни я пытаюсь классы обходить
-
stanlee
тогда переписывай.
-
:)
ну я попробовал
$CString = new CString;
$CString -> CString("ля ля ля");
если конечно правильно - ничего не вернулось
и еще ругается пехепе что ошибка
тут
$text = preg_replace_callback(\'{<(?:[^\'">]+|".*?"|\'.*?\')+>}s\', array($this, \'szCleanHTML\'), $text);
и тут
$text = preg_replace(\'{(?<=S)\'}\', APOS, $text);
???
-
stanlee
ну и неправильно пробовал
потом я написал, что форум слеши порезал.
-
а как правильно ? :(
-
ThE0ReTiC
Я так понял, основная функция у hiero.ru/david - TypoAll с передачей строки текста?
как предыдущая версия не совсем корректно обрабатывала HTML и перестала удовлетворять
А подробнее???
-
CGVictor
да
здесь это
$obNamej->szTypograf($string)
подробнее - она была написана совсем по другому - там был больший функционал, но правильно обрабатывался только plain text
кавычки в HTML обрабатывали некорректно (не все пропускались)
-
ThE0ReTiC
А можно (пальцем) это место в вышеприведенном коде? А то чего-то отличий не заметно... Или плохо смотрю...
-
CGVictor
ты не понял.
это моя предидущая версия перестала меня устраивать
приведенный код - классовая обертка к тому, что я дал по ссылке.
все.
реализация
http://hiero.ru/david/typographer.php
в виде класса
-
ThE0ReTiC
Ааа! Ну всё, ясно! Спасибо!