- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Помогите составить правильную регулярку для борьбы с висячими предлогами. Нашел тему для ворда - http://blog.alexkrylov.ru/journalshowcomments.php?jpostid=116707137&journalid=1865558&go=next&categ=0
По этому принципу код выходит таким:
$result = preg_replace("/([ | ])([а-яА-Яa-zA-Z]{1,2}) ([а-яА-Яa-zA-Z])/",
"\\1\\2 \\3",
$text);
$result = preg_replace("/([ | ])([а-яА-Яa-zA-Z]{1,2}) ([а-яА-Яa-zA-Z])/",
"\\1\\2 \\3",
$result);
Нужно дублировать два раза, иначе не все заменяет. Может можно более разумно ее составить? Не силен в регулярках.
P.S. Висячий предлог (ВП) — это тот, что оставлен в конце строки. По правилам верстки не допускается. Т.е. после каждого предлога и союза необходимо ставить неразрывный пробел. Хз зачем так издеваться, но надо блин.
Kel_Kimpbell, дайте примеров "висячих предлогов", а то чота не хочется на ночь глядя мозг напрягать)
По правилам типографики
Вот http://rmcreative.ru/blog/post/tipograf есть нужный Вам класс
---------- Добавлено 15.01.2013 в 00:23 ----------
Kel_Kimpbell, дайте примеров "висячих предлогов", а то чота не хочется на ночь глядя мозг напрягать)
Вот смотрите.. подошел к чему-то
С точки зрения типографики к - это висячий предлог, он должен перенестись вместе с ближ словом
т.е
подошел
к чему-то
Но не
подошел к
чему-то
Чтобы не перенесся, нужно поставить неразрывный пробел
---------- Добавлено 15.01.2013 в 00:32 ----------
выдраная из примера регулярка
$prepos = '(:?а|без|безо|в|во|вне|да|для|до|ее|ещё|еще|и|или|из|изо|или|их|за|к|как|ко|меж|между|на|над|надо|не|ни|но|о|об|обо|от|ото|перед|передо|по|под|подо|пред|предо|при|про|около|с|сквозь|со|то|там|у|уж|что|через|я|'.$sym['mdash'].')';
'/(?<=\s|^|\W)'.$prepos.'(\s+)/i' => '$1'.$sym['nbsp'],
если есть проблемы с повторяющимся пробелами (два и более) [ ] заменить на [ ]+
Огромное спасибо!
Понимаю, что у каждого свой велосипед, но мне понравилось данное решение:
http://www.webfilin.ru/instruments/typograf
ну и такое простое решение, свободно лежащее в сети:
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;
}
Дважды нужно применять регулярку потому, что так называемых "висячих предлогов" может быть несколько подряд.
Например такое предложение: "Он и сам мог справиться, но и от помощи не стал отказываться."
Если приведенная ТС регулярка уже использовала какие-то символвы строки в найденной подстроке, они уже не будут использоваться для дальнейшего поиска.
Поэтому после первого прохода по строке получается вот так
"Он и сам мог справиться, но и от помощи не стал отказываться."
И чтоб заменить оставшийся пробел, приходится применять замену еще раз
Ни один из предложенных примеров не решает этой проблем за один раз.
Все они способны сделать полную замену только после двух применений.
Но решение есть, например такое:
$result = preg_replace("/(?<= | )([а-яА-Яa-zA-Z]{1,2}) (?=[а-яА-Яa-zA-Z])/", "\\1 ", $text);
В результате после однократного применения получается такая строка
"Он и сам мог справиться, но и от помощи не стал отказываться."
Эта регулярка включает в найденное только "предлог" и пробел после него, но одновременно (не включая в найденное) проверяя наличие пробельного символа перед "предлогом" и текстовый символ после пробела за "предлогом".
А не подскажете еще как типограф в битрикс встроить? Вот этот http://rmcreative.ru/blog/post/tipograf
Т.е. хочется обработать сразу весь контент, а не каждую переменную выискивать в шаблонах.
Я так понимаю это нужно делать через буфер. Но пока не нашел где именно идет обработка буфера.
Вы все верно понимаете - нужно обрабатывать буфер. Но гораздо более правильным решением было бы обрабатывать отдельные участки кода, т.к. не всегда полный буфер содержит данные, необходимые для типографирования - коды js, навигация и т.п.
С битриксом не знаком, поэтому подсказать точно не смогу.
но и от помощи
А вот несколько более часто встречающиеся последовательности лучше так жестоко не обрабатывать. Например «не» привязывается всегда, а в «и не» — и не
Мне казалось это лучше делать по списку, его приходится делать, часто в текстах криво употребляется «т.е.» — т. е.
то есть
Некоторые тексты кишат архаикой: ибо жизнь твоя...
или неформальным употреблением дефисов: не-поклонник — не& #8209;поклонник
«из-за» — из& #8209;за
...
ли
...
кое-что
кое& #8209;что
Ещё можно вспомнить
инициалы А.С.Пушкин — А. С. Пушкин
забытые пробелы —так.
лишние пробелы: слово ,
И кто ещё возьмётся добавить к этому всему висячую пунктуацию, чтобы за один проход всё правильно получалось?
И кто ещё возьмётся добавить к этому всему висячую пунктуацию, чтобы за один проход всё правильно получалось?
Все описанное и за один проход?
А смысл?
Вот регулярка для правильных Инициалов
'~([А-ЯA-Z]\.)\s?([А-ЯA-Z]\.)\s?([А-Яа-яA-Za-z]+)~s'