функция по расстановке переносов

Annushka

Новичок
функция по расстановке переносов

Добрый день.
Я не волшебница, а только учусь, прошу не судить строго...
У меня такой вопрос:
мне для лабы нужна функция по расстановке переносов в словах, я такую нашла, но вот беда, она работает с utf-8, а мне надо ср1251. И так как объемы текстов будут большие, использование перекодирования текста на лету, не приветствуется(и тормозит скрипт, проверила на практике), а моих знаний что-бы переделать ф-цию не хватает(пока). Подскажите как её переделать? Текст ф-ции такой:

PHP:
function hyphen_words($text) 
{ 
    #буква (letter) 
    $l = '(?:\xd0[\x90-\xbf\x81]|\xd1[\x80-\x8f\x91]  #А-я (все) 
           | [a-zA-Z] 
           )'; 

    #гласная (vowel) 
    $v = '(?:\xd0[\xb0\xb5\xb8\xbe]|\xd1[\x83\x8b\x8d\x8e\x8f\x91]  #аеиоуыэюяё (гласные) 
           | \xd0[\x90\x95\x98\x9e\xa3\xab\xad\xae\xaf\x81]         #АЕИОУЫЭЮЯЁ (гласные) 
           | (?i:[aeiouy]) 
           )'; 

    #согласная (consonant) 
    $c = '(?:\xd0[\xb1-\xb4\xb6\xb7\xba-\xbd\xbf]|\xd1[\x80\x81\x82\x84-\x89]  #бвгджзклмнпрстфхцчшщ (согласные) 
           | \xd0[\x91-\x94\x96\x97\x9a-\x9d\x9f-\xa2\xa4-\xa9]                #БВГДЖЗКЛМНПРСТФХЦЧШЩ (согласные) 
           | (?i:sh|ch|qu|[bcdfghjklmnpqrstvwxz]) 
           )'; 

    #специальные 
    $x = '(?:\xd0[\x99\xaa\xac\xb9]|\xd1[\x8a\x8c])';   #ЙЪЬйъь (специальные) 

    /* 
    #алго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", 
    ); 

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

denver

?>Скриптер
Annushka
Подскажите как её переделать?
Для начала находишь в гугле описание алгоpитма (смотри комментарии) и понимаешь как он должен работать (а хоть и на примере этой функции). А затем уже можешь и свою написать, если лень думать над этой.
 

ksnk

прохожий
Нужно убрать значения в utf и заменить их тем, что было раньше. Оно стоит в комментариях. Таким образом
Код:
    $l = '(?:\xd0[\x90-\xbf\x81]|\xd1[\x80-\x8f\x91]  #А-я (все)
преобразуется в
Код:
    $l = '(?:А-я #(все)
Теперь знаний хватит? :)
Ах, да! пред-пред-последняя строчка будет выглядеть так
Код:
    $text = preg_replace($rules, "$1\xad$2", $text); // не \xc2\xad
 

Annushka

Новичок
Автор оригинала: ksnk
Нужно убрать значения в utf и заменить их тем, что было раньше. Оно стоит в комментариях. Таким образом
Код:
    $l = '(?:\xd0[\x90-\xbf\x81]|\xd1[\x80-\x8f\x91]  #А-я (все)
преобразуется в
Код:
    $l = '(?:А-я #(все)
Теперь знаний хватит? :)
Ах, да! пред-пред-последняя строчка будет выглядеть так
Код:
    $text = preg_replace($rules, "$1\xad$2", $text); // не \xc2\xad
теперь и попробую. ;-) спасибо.
 

Фанат

oncle terrible
Команда форума
ksnk
тебе не кажется, что \xd0[\x90-\xbf\x81]|\xd1[\x80-\x8f\x91] НЕ СОВСЕМ соответствует А-я?

Annushka
я бы предложил вывести эти паттерны в браузер, установив нужную кодировку, и полученные строки скопировал с экрана
 

Annushka

Новичок
PHP:
сделала вот так и не работает :-(. Подскажите где обшиблась?

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",
    );

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

Trianon

Новичок
\xd0

Вы убрали xd0 , оставив зачем-то слэш. Слэш тоже надо убрать. В шести местах.
И всё заработает.
 

Annushka

Новичок
Автор оригинала: Фанат
ksnk
тебе не кажется, что \xd0[\x90-\xbf\x81]|\xd1[\x80-\x8f\x91] НЕ СОВСЕМ соответствует А-я?

Annushka
я бы предложил вывести эти паттерны в браузер, установив нужную кодировку, и полученные строки скопировал с экрана
я пробовала, дело в том что к это ничего не дает(копирование текста+ установка utf-8 в браузере)... кроме того что комментарии к функции,
которые написаны в 1251 превращаются в набор иероглифов :)

-~{}~ 07.09.06 12:39:

Автор оригинала: Trianon
\xd0

Вы убрали xd0 , оставив зачем-то слэш. Слэш тоже надо убрать. В шести местах.
И всё заработает.
действительно работает :). спасибо огромное... ура!!!
 

ksnk

прохожий
Annushka
Фанат прав!
Буква ё не входит в паттерн А-я
 
Сверху