Первая буква в предложении - прописная, как?

Тема в разделе "Регулярные выражения", создана пользователем Starik777, 18 ноя 2008.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Starik777

    Starik777 Постоялец

    Регистр.:
    19 апр 2008
    Сообщения:
    66
    Симпатии:
    35
    Привет всем. Такое дело. Генерируется текст. Предложения - все слова строчными буквами. Заканчиваются предложения на .,!?
    Хочется: чтобы все предложения начинались с заглавной буквы. Можно ли это сделать регулярными выр-ниями, а то я это так коряво делаю - разбиваю предложения на символы и первый символ делаю заглавным. Язык PHP.
     
  2. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    зачем тебе регулярка, выводи текст частями

    $string = "bla-bla-bla"; //строка
    $firsLetter = substr( $string , 0, 1); //получаеш перввую букву
    $firsLetter = strtoupper($firsLetter); // переводиш в заглавную букву
    $string = substr( $string , 1);//все кроме первой буквы
    echo .$firsLetter.$string; //выводим нужное

    Теперь додумай алгоритм разбора строки что б получить все что между .!? и будет счастье
     
  3. Starik777

    Starik777 Постоялец

    Регистр.:
    19 апр 2008
    Сообщения:
    66
    Симпатии:
    35
    Спасибо. Но это я как раз так и делаю :confused:. Я понимаю что этот путь простой и в принципе естественный, а так же он не плохо работает.
    Давайте я перефразирую вопрос: из чисто академических и эстетических чувств, мне интересно как эту задачу можно решить регулярками. Или нельзя?
    В частности как букву заглавной сделать? preg_replace('~(a)~',strtoupper("\$1"),$text); - не работает, или я что-то не понимаю?
     
  4. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    Алгоритм:
    1. Имеем строку.
    2. определяемся с pattern - то что мы ищем(симолы .!? + 2 знака после него, первый знак пробел, второй это первая буква кооторую нужно изменить)
    3. Определяемся с replacement - на что заменяем (найдененый патерн заменяем на strtoupper($pattern)

    Пишем регуляторку preg_replace

    PHP:
    SetLocale(LC_CTYPE"ru_RU.CP1251");
    $text="текст. текст? текст! текст текст.\ntext. text? text! text text";
    echo 
    'Исходная строка<BR>';
    echo 
    $text;
    $pattern "#(?<=[.?!]|^)(\s*)([a-zа-я])#s";
    $text preg_replace_callback($pattern"f_replace"$text);
    echo 
    '<BR>Строка после замены<BR>';
    echo 
    $text;
    function 
    f_replace($arr) {
       return 
    $arr[1] . strtoupper($arr[2]);
    }
     
    Starik777 нравится это.
  5. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Достаточно разбить текст на предложения, далееhttp://ru2.php.net/manual/ru/function.ucfirst.phpПример оттуда же (хотя я бы делал по другому)
    PHP:
    <?php

    function sentence_cap($impexp$sentence_split) {
        
    $textbad=explode($impexp$sentence_split);
        
    $newtext = array();
        foreach (
    $textbad as $sentence) {
            
    $sentencegood=ucfirst(strtolower($sentence));
            
    $newtext[] = $sentencegood;
        }
        
    $textgood implode($impexp$newtext);
        return 
    $textgood;
    }

    $text "this is a sentence. this is another sentence! this is the fourth sentence? no, this is the fourth sentence.";
    $text sentence_cap(". ",$text);
    $text sentence_cap("! ",$text);
    $text sentence_cap("? ",$text);

    echo 
    $text// This is a sentence. This is another sentence! This is the fourth sentence? No, this is the fourth sentence.

    ?>
     
    latteo и Starik777 нравится это.
  6. Avtandil

    Avtandil Создатель

    Регистр.:
    30 сен 2006
    Сообщения:
    30
    Симпатии:
    24
    Предложу упрощённый вариант поста #4. Предполагается, что русская локаль уже установлена.
    PHP:
    $text 'this is a sentence.
    this is another sentence!
    this is the fourth sentence? no, this is the fourth sentence.'
    ;
    echo 
    preg_replace('/(^|[.!?]\s+)([a-zа-я])/ie',"'$1'.strtoupper('$2')",$text);
     
  7. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
  8. vitvvs

    vitvvs Постоялец

    Регистр.:
    4 окт 2007
    Сообщения:
    92
    Симпатии:
    11
    ucfirst($predlojenie);
     
    restarterx нравится это.
  9. alex-bot

    alex-bot Nulled-Man

    Регистр.:
    4 май 2007
    Сообщения:
    498
    Симпатии:
    144
    PHP это хорошо, а если есть люди в теме подскажите плиз можно ли эту же задачу сделать в TextPipe Pro, вроде все там перерыл, ничерта не получается. Или это в нме и не предусмотрено.
    В общем пробовал там и Pattern, Perl Pattern
    из блока замены так ^[.] и замена на $$ и все это с сабфильтером UPPERCASE! Как правильно указать первый символ строки, мне кажется проблема в этом...
     
  10. antn

    antn Постоялец

    Регистр.:
    11 июл 2009
    Сообщения:
    104
    Симпатии:
    30
    Задача вообще практически нерешаема, т.к. точка используется не только для обозначения конца предложения, но и для сокращ.
     
Статус темы:
Закрыта.