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

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

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

 

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

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

тема: Правильная расстановка мягких переносов в тексте - переменной
 
 автор: Ruri   (20.08.2008 в 17:02)   письмо автору
 
 

Здравствуйте!!! Помогите, пожалуйста, "чайнику" с созданием регулярного выражения для ПХП скрипта, для правильной с точки зрения грамматики русского языка, расстановки "мягких переносов" при выводе текста в броузере!!! Может ли кто-нибудь помочь в этом сложном деле ??? И можно ли такой скрипт сделать мультиязычним? Например, для английского языка, для русского и для украинского???

  Ответить  
 
 автор: xx77   (20.08.2008 в 22:25)   письмо автору
 
   для: Ruri   (20.08.2008 в 17:02)
 

> правильной с точки зрения грамматики русского языка, расстановки "мягких переносов"

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

> для английского языка, для русского и для украинского

думаю что обрабатываемый текст только в кодировке UTF-8 ,из часто-применяемых кодировок,
может одновременно содержать, наборы букв всех трёх языков, но не уверен на все 100 процентов

  Ответить  
 
 автор: Trianon   (21.08.2008 в 00:02)   письмо автору
 
   для: Ruri   (20.08.2008 в 17:02)
 

http://softtime.ru/forum/read.php?id_forum=6&id_theme=24186

а оригинал, помнится, был для utf-8

  Ответить  
 
 автор: Ruri   (21.08.2008 в 11:46)   письмо автору
 
   для: Trianon   (21.08.2008 в 00:02)
 

Большое Спасибо !!! Не верю своим глазам !!! Оно таки работает !!! Ур-р-р-р-р-а !!!

  Ответить  
 
 автор: Ruri   (25.08.2008 в 17:39)   письмо автору
 
   для: Ruri   (21.08.2008 в 11:46)
 

Помогите, пожалуйста, снова !!!
Предложенная функция, действительно отлично работает !!! Но !!! Она также режет мягкими переносами и УРЛы !!! Это кошмар наяву !!! Ни одна внешняя ссылка на сайте не работает !!! Помогите сделать "для чайника" исключение в функции расстановки мягких переносов, чтобы УРЛы оставались целыми !!! Пожалуйста !!!
Или хотя бы ещё одно регулярное выражение, которое бы из УРЛов вырезало всё что непотребно там быть. Help !!!

  Ответить  
 
 автор: Trianon   (25.08.2008 в 18:14)   письмо автору
 
   для: Ruri   (25.08.2008 в 17:39)
 

А URLы там каким боком? В URL нет и не может быть никакой кириллицы.
Да и функция предназначена для разбивки исколючительно русского текста.
Никаких URL опять же в аргументах быть не может по определению.

  Ответить  
 
 автор: Ruri   (26.08.2008 в 16:36)   письмо автору
 
   для: Trianon   (25.08.2008 в 18:14)
 

Урлы эта классная штуковина режет по всем правилам мягких переносов !!!
Например: http://ram-bler.ru или http://za-zhi-to-mir.info
То есть в Урлах появляются мягкие переносы, которые там вообще не должны быть в природе ...

  Ответить  
 
 автор: Trianon   (26.08.2008 в 17:05)   письмо автору
 
   для: Ruri   (26.08.2008 в 16:36)
 

Хе-хе-хе... неплохо режет, однако :))

ну так уберите из выражений списки латинских букв.

  Ответить  
 
 автор: Ruri   (26.08.2008 в 18:17)   письмо автору
 
   для: Trianon   (26.08.2008 в 17:05)
 

Спасибо за подсказку !!! Сейчас попробую !!! Может что и получится !!! Сердечно благодарю, что не оставили в беде !!!

  Ответить  
 
 автор: Ruri   (26.08.2008 в 18:48)   письмо автору
 
   для: Ruri   (26.08.2008 в 18:17)
 

function hyphen_words($text)
{
// - временная заплата
return $text;
// - - - - - - - - - -

#буква (letter)
$l = '(?:[ёЁА-я] #ё Ё А-я (все)
| [a-zA-Z]
)';

#гласная (vowel)
$v = '(?:[аеиоуыэюяё] #аеиоуыэюяё (гласные)
| [АЕИОУЫЭЮЯЁ] #АЕИОУЫЭЮЯЁ (гласные)
| (?i:[aeiouy])
)';

#согласная (consonant)
$c = '(?:[бвгджзклмнпрстфхцчшщ] #бвгджзклмнпрстфхцчшщ (согласные)
| [БВГДЖЗКЛМНПРСТФХЦЧШЩ] #БВГДЖЗКЛМНПРСТФХЦЧШЩ (согласные)
| (?i:sh|ch|qu|[bcdfghjklmnpqrstvwxz])
)';

#специальные
$x = '(?:[ЙЪЬйъь])'; #ЙЪЬйъь (специальные)

/*
#алгоpитм П.Хpистова в модификации Дымченко и Ваpсанофьева
$rules = array(
# $1 $2
"/($x) ($l$l)/sx",
"/($v) ($v$l)/sx",
"/($v$c) ($c$v)/sx",
"/($c$v) ($c$v)/sx",
"/($v$c) ($c$c$v)/sx",
"/($v$c$c) ($c$c$v)/sx"
);
*/

#improved rules by D. Koteroff
$rules = array(
# $1 $2
"/($x) ($l$l)/sx",
"/($v$c$c) ($c$c$v)/sx",
"/($v$c$c) ($c$v)/sx",
"/($v$c) ($c$c$v)/sx",
"/($c$v) ($c$v)/sx",
"/($v$c) ($c$v)/sx",
"/($c$v) ($v$l)/sx",
);

#\xad = ­
$text = preg_replace($rules, "$1\xad$2", $text); // не \xc2\xad
return $text;
}

//echo hyphen_words("Проверка алгоpитма");




Извиняюсь ещё раз !!! Но в каком месте нужно отключить латинские буквы ???

  Ответить  
 
 автор: Ruri   (27.08.2008 в 17:32)   письмо автору
 
   для: Ruri   (26.08.2008 в 18:48)
 

Ну, пожалуйста, помогите "чайнику" !!! Уж очень эта проблема припекла !!! С меня пиво по факсу !!!
Или лучше, скажите, пожалуйста, как через регулярные выражения только из УРЛов выбросить мягкие переносы ???

  Ответить  
 
 автор: xx77   (27.08.2008 в 22:52)   письмо автору
 
   для: Ruri   (27.08.2008 в 17:32)
 

только с русскими буквами применрно так
<?

function hyphen_words($text

    
#буква (letter) 
    
$l '[ёЁА-я]'
    
#гласная (vowel) 
    
$v '(?:[аеиоуыэюяё]|[АЕИОУЫЭЮЯЁ])'
    
#согласная (consonant) 
    
$c '(?:[бвгджзклмнпрстфхцчшщ]|[БВГДЖЗКЛМНПРСТФХЦЧШЩ])'
    
#специальные 
    
$x '[ЙЪЬйъь]';   #ЙЪЬйъь (специальные) 
  
 
$rules = array( 
        
"/($x)($l$l)/sx"
        
"/($v$c$c)($c$c$v)/"
        
"/($v$c$c)($c$v)/"
        
"/($v$c)($c$c$v)/"
        
"/($c$v)($c$v)/"
        
"/($v$c)($c$v)/"
        
"/($c$v)($v$l)/"
    );
    
$text preg_replace($rules"$1-$2"$text); // не \xc2\xad 
    
return  $text

  Ответить  
 
 автор: Ruri   (28.08.2008 в 17:34)   письмо автору
 
   для: xx77   (27.08.2008 в 22:52)
 

Большое-пребольшое СПАСИБО !!! Сейчас буду пробовать !!!

  Ответить  
 
 автор: Ruri   (29.08.2008 в 09:57)   письмо автору
 
   для: Ruri   (28.08.2008 в 17:34)
 

Прлучился УЖАС !!!

Об-зор бри-танс-кой и аме-риканс-кой прес-сы за 13 ав-густа 2008 по си-ту-ации в Юж-ной Осе-тии и вок-руг нее.
Вот уже поч-ти не-делю за-пад-ная пе-чать пре-быва-ет в кон-ту-жен-ном сос-то-янии пос-ле мас-си-рован-ных уда-ров гру-зинс-ко-го про-паган-дист-ско-го «ору-жия мас-со-вого по-раже-ния» – изощ-ренной лжи о про-ис-хо-дящем в Юж-ной Осе-тии. Но, по-хоже, не-кото-рые за-пад-ные жур-на-лис-ты на-чали при-ходить в се-бя, пы-та-ясь бо-лее адек-ватно от-ра-жать си-ту-ацию гру-зино-осе-тинс-ко-го конф-лик-та.

Все "мягкие переносы появились в браузере !!! Пли-и-и-и-из !!!! Что делать ????

  Ответить  
 
 автор: Trianon   (29.08.2008 в 12:39)   письмо автору
 
   для: Ruri   (29.08.2008 в 09:57)
 

Посмотрите предпоследнюю строку скрипта.
Вы выполняете замену на минус, а не на мягкий перенос.

  Ответить  
 
 автор: xx77   (29.08.2008 в 14:12)   письмо автору
 
   для: Ruri   (29.08.2008 в 09:57)
 

этот алгоритм должен работать только с чистым текстом , без html.
и для того что-бы применить его для форматирования блока текста , Вам нужен ещё один алгоритм.
Который будет считать ширину в пикселях занимаемую строкой , применительно
к используемому шрифту. Точнее будет прибавлять ширину занимаемую каждым символом к общей ширине строки.
регулярные выражения работают только с байтами, и даже сосчитать по байтам нужен алгоритм точнее чем например такой
<?php
function mp($match)  
{  
    
$l '[ёЁА-я]'
    
$v '(?:[аеиоуыэюяё]|[АЕИОУЫЭЮЯЁ])'
    
$c '(?:[бвгджзклмнпрстфхцчшщ]|[БВГДЖЗКЛМНПРСТФХЦЧШЩ])'
    
$x '[ЙЪЬйъь]';
 
$rules 
"/^($x(?=$l$l)|$v$c$c(?=$c$c$v)|$v$c$c(?=$c$v)|$v$c(?=$c$c$v)|$c$v(?=$c$v)|$v$c(?=$c$v)|$c$v(?=$v$l))(.+)/"
 
##########################################################
 
if (isset($match[3] )  &&  ($txt preg_replace($rules'$1-' ."\n" '$2'$match[2], 1) ) != $match[2]) return $match[1] . $txt;
 else  return  
$match[1] . $match[2] . "\n" 
##end function

$text 'Длинный длинный текст
с малым числом переноса строк'
;

$text split("[\r\n]+"$text);
# print_r($text );
print '<pre style="border:solid 3px red; width:40em; padding:15px">'
 
implode("\n", ($text preg_replace_callback(
'#(.{0,45}[^ЁёА-я])(.{3,6}[^ЁёА-я]|([ЁёА-я]+))#',
 
'mp'$text)))
 . 
'</pre>'

?>

  Ответить  
 
 автор: Ruri   (29.08.2008 в 17:29)   письмо автору
 
   для: xx77   (29.08.2008 в 14:12)
 

Большое спасибо !!!

  Ответить  
 
 автор: Ruri   (24.09.2008 в 18:14)   письмо автору
 
   для: Ruri   (29.08.2008 в 17:29)
 

Проявилась маленькая неприятность... Функция работает замечательно, но она режет и активные ссылки. Вместо примерно такого http://arhiv.ru/trekus.mp3 появляется на экране
http://ar-hiv.ru/tre-kus.mp3

Может кто-нибудь что-либо подсказать, пожалуйста ???

  Ответить  
 
 автор: EXP   (26.09.2008 в 01:48)   письмо автору
 
   для: Ruri   (24.09.2008 в 18:14)
 

Как Вы её используете ?
Почему у Вас прогоняется через функцмю всё , включая теги ?

  Ответить  
 
 автор: Ruri   (29.09.2008 в 18:48)   письмо автору
 
   для: EXP   (26.09.2008 в 01:48)
 

У меня текст статьи полностью, вместе с тегами хранится в Базе Данных. Так её туда редактор засовывает. А когда я вывожу статью для пользователя, вся статья, как одна переменная прогоняется через функцию расстановки мягких переносов. Вот и получается такая маленькая неприятность... Где и Что я делаю не правильно ??? Подскажите, пожалуйста !!!

  Ответить  
 
 автор: exp   (29.09.2008 в 22:07)   письмо автору
 
   для: Ruri   (29.09.2008 в 18:48)
 

Как чайник чайнику , советую Вам подумать не применить-ли например
просто style="text-align:justify;" (если не путаю буквы в слове justify ) к блоку в который выводится этот html-текст
, а то непонятно что Вам хочется от алгоритма который находит куда в любое слово ,можно было-бы вставить перенос слова, если можно.

>Об-зор бри-танс-кой и аме-риканс

а сложный анализ этого html-текста
, с целью определить куда именно нужно поставить перенос , да ещё незадев разметку,,
он сделает лучше всего только то, что в десятки - сотни, раз, замедлит генерацию этой самой странички
, оформление которой вы и хотите сделать лучше , применяя переносы слов по слогам ,
если я вообще понял для чего вам это нужно

  Ответить  
 
 автор: Ruri   (30.09.2008 в 10:31)   письмо автору
 
   для: exp   (29.09.2008 в 22:07)
 

Просто подскажите, как в регулярном выражении, которое с Вашей помощью я применяю, запретить резать слова на английском регистре (т.е. запретить трогать латиницу).

function hyphen_words($text)
{
#буква (letter)
$l = '(?:[ёЁА-я] #ё Ё А-я (все)
| [a-zA-Z]
)';

#гласная (vowel)
$v = '(?:[аеиоуыэюяё] #аеиоуыэюяё (гласные)
| [АЕИОУЫЭЮЯЁ] #АЕИОУЫЭЮЯЁ (гласные)
| (?i:[aeiouy])
)';

#согласная (consonant)
$c = '(?:[бвгджзклмнпрстфхцчшщ] #бвгджзклмнпрстфхцчшщ (согласные)
| [БВГДЖЗКЛМНПРСТФХЦЧШЩ] #БВГДЖЗКЛМНПРСТФХЦЧШЩ (согласные)
| (?i:sh|ch|qu|[bcdfghjklmnpqrstvwxz])
)';

#специальные
$x = '(?:[ЙЪЬйъь])'; #ЙЪЬйъь (специальные)

/*
#алгоpитм П.Хpистова в модификации Дымченко и Ваpсанофьева
$rules = array(
# $1 $2
"/($x) ($l$l)/sx",
"/($v) ($v$l)/sx",
"/($v$c) ($c$v)/sx",
"/($c$v) ($c$v)/sx",
"/($v$c) ($c$c$v)/sx",
"/($v$c$c) ($c$c$v)/sx"
);
*/

#improved rules by D. Koteroff
$rules = array(
# $1 $2
"/($x) ($l$l)/sx",
"/($v$c$c) ($c$c$v)/sx",
"/($v$c$c) ($c$v)/sx",
"/($v$c) ($c$c$v)/sx",
"/($c$v) ($c$v)/sx",
"/($v$c) ($c$v)/sx",
"/($c$v) ($v$l)/sx",
);

#\xad = &shy;
$text = preg_replace($rules, "$1\xad$2", $text); // не \xc2\xad
return $text;
}

  Ответить  
Rambler's Top100
вверх

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