Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Типограф: неразрывный пробел после коротких слов
 
 автор: antf   (14.03.2007 в 00:30)   письмо автору
 
 

Здравствуйте. В аттаче приведен небольшой фрагмент кода типографа, в котором после слов, длина которых не больше 3 букв ставится неразрывный пробел   Все бы хорошо, но вот почему не ставится пробел после предлога "в" в предложении:

Он сел в мое такси на "бульваре Осман : "очень" старый господин с красивыми седыми  усами  и седой  бородой, которую, впрочем, он потом, когда  мы ближе познакомились,  сбрил.


Заранее спасибо.

   
 
 автор: cheops   (14.03.2007 в 13:29)   письмо автору
 
   для: antf   (14.03.2007 в 00:30)
 

Тестируете на локальной машине, на сервере?

   
 
 автор: antf   (14.03.2007 в 13:34)   письмо автору
 
   для: cheops   (14.03.2007 в 13:29)
 

На локальной машине.

   
 
 автор: antf   (21.03.2007 в 11:21)   письмо автору
 
   для: antf   (14.03.2007 в 13:34)
 

Никто не догадывается с чем связан такой глюк?

   
 
 автор: Trianon   (22.03.2007 в 11:30)   письмо автору
 
   для: antf   (21.03.2007 в 11:21)
 

Можно предположить - потому, что следующее слово тоже короткое.

   
 
 автор: SHAman   (22.03.2007 в 13:15)   письмо автору
 
   для: antf   (14.03.2007 в 00:30)
 

Я не полез в дебри, но могу сказать, что добился почти верного результата, когда исправил две строчки:


    //короткие слова 1-3 символа
    $str = preg_replace("/( | )?\b([а-я]{1,3})\b/i", " $2 ", $str);
//    $str = preg_replace("/^([а-яa-z]{1,3})\s/i", " $1 ", $str);


Прошу обратить внимание, что вторая строка при таком подходе вообще не нужна. Для справки: \b обозначает конец слова - невидимое и эвфемерное междусимвольное пространство на границе слова и неслова.

   
 
 автор: antf   (26.03.2007 в 00:31)   письмо автору
 
   для: SHAman   (22.03.2007 в 13:15)
 

У меня не подходит :) Сейчас, наверное, все будут смеятся, но нужно повторить пять раз одну и ту же строку кода:


      //ставим неразрывный пробел после коротких слов 1-3 символа
      $str = preg_replace("/( |\s)([а-я]{1,3})\s/im", " $2 ", $str);
      $str = preg_replace("/( |\s)([а-я]{1,3})\s/im", " $2 ", $str);
    $str = preg_replace("/( |\s)([а-я]{1,3})\s/im", " $2 ", $str);
    $str = preg_replace("/( |\s)([а-я]{1,3})\s/im", " $2 ", $str);
    $str = preg_replace("/( |\s)([а-я]{1,3})\s/im", " $2 ", $str);

   
 
 автор: antf   (26.03.2007 в 00:38)   письмо автору
 
   для: antf   (26.03.2007 в 00:31)
 

Правда при таком тексте все равно выдает ошибки, не ставит пробелы:

на на на на на на на на на на на на на на на на на на на на на на на на на на на
на на на на на на на на на на на на на на на на на на на на на на на на на на на 
на на на на на на на на на на на на на на на на на на на на на на на на на на на  


Типограф Лебедева тоже не справляется :) Видно причина кроется в свойствах самих регулярных выражений.
http://web.artlebedev.ru/tools/typograf/

   
 
 автор: SHAman   (26.03.2007 в 13:49)   письмо автору
 
   для: antf   (26.03.2007 в 00:38)
 

Не может быть, чтобы регулярки работали не правильно! Им уже много лет и их активно пользуют. И разрабатывал их далеко не дурак. Так что этот вариант отпадает.

Просто нужно ставить цикл while (есть такое дело) {изменять} Почти наверняка поможет.

   
 
 автор: antf   (26.03.2007 в 14:40)   письмо автору
 
   для: SHAman   (26.03.2007 в 13:49)
 

Я не говорю, что они работают неправильн. Я говорю, что тут какое-то свойство, о котором надо знать. См. типограф Лебедева там такие же глюки.

   
 
 автор: SHAman   (26.03.2007 в 15:40)   письмо автору
 
   для: antf   (26.03.2007 в 14:40)
 

Если я не ошибаюсь, то вот эта регулярка, лови ; )


    $str = preg_replace("/\b([а-я]{1,3})\b\s/im", "$1 ", $str);


Хотя я бы заменил [а-я] на \w, или расширил бы до [a-zа-я]

Кстати, я знаю один неплохой типограф, доступный для скачивания. Можешь глянуть.

   
 
 автор: Lelik   (08.04.2007 в 11:28)   письмо автору
 
   для: antf   (14.03.2007 в 00:30)
 

будет интересно почитать о шаблонах для типографики.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования