silicoid

Рейтинг
171
Регистрация
13.10.2014
Drinktea #:

можно потеряться))

какой итоговый код, то? 

https://searchengines.guru/ru/forum/1036230/page3#comment_16532933

но надо заменить одну строку  отсюда:
https://searchengines.guru/ru/forum/1036230/page4#comment_16532962

Потестил на полном томе Войны и мира. Работает достаточно шустро. Текстовый файл в 1.21Мегабайта, содержащий 8003 предложения, деребанит примерно за 0.06 секунды на PHP 7.0
вариантов решения море. но я бы добавил к каждой кнопке data аттрибут, в котором бы описал что делать
пример
<a href="#" class="need-action" data-action="open">действие: открытие окна</a>
<a href="#" class="need-action" data-action="open">действие: открытие окна</a>
<a href="#" class="need-action" data-action="redirect">действие: редирект</a>

<script>
$(document).ready(function(){
    $('.need-action').click(function(){
        var aType = $(this).attr('action');
        if (aType == 'open'){
            //Открываем окно    
        }
        if (aType == 'redirect'){
            //Переходим куда-нибудь
        }
    return false;
    })
})
</script>

Но тут возник еще один вопрос. Если у нас есть прямая речь, состоящая из двух предложений, например:

В записочках, разосланных утром с красным лакеем, было написано без различия во всех: "Si vous n'avez rien de mieux a faire, M. le comte (или mon prince), et si la perspective de passer la soiree chez une pauvre malade ne vous effraye pas trop, je serai charmee de vous voir chez moi entre 7 et 10 heures. Annette Scherer".


то по-хорошему, пилить внутри прямой речи текст нельзя

А я тут слегка переработал регэкспу.
$text = preg_replace(['/\R+|\t+|\]|\[/imu', '/\s+/imu', '/(\S)\s\,/imu', '/^\s+/imu', '/(\.+|\?+|\!+)(\s+)([A-Z|А-Я|\-]+)/u' ],['', ' ', '$1,', '', '$1$2{:separate:}$3'], $text);

Она теперь удаляет пробелы перед запятой (запятая не должна отбиваться от текста) Ну и исправил тему с точкой в середине предложения.
пример такого текста с "левой" точкой может быть  "Новости, статьи и т.д. должны быть переименованы!"
делилка на устойчивые сокращения срабатывать не должна.

В самом начале, также выпиливаются квадратные скобки.
дело в том, что я тестирую этого "желтого полосатика" на Войне и Мире и там море сносок, обернутых в квадратные скобки.

        public function index()
        {
                $text = file_get_contents(FCPATH.'peace_and_war.txt');
                print_r($this->text_explode($text,5));
        }
        
        
        public function text_explode($text, $length = 4, $offset=0)
        {
                // удаляем символы табуляции и переводы строк
                // размечаем документ для последующего деления
                $text = preg_replace(['/\R+|\t+/imu', '/\s+/imu', '/^\s+/imu', '/(\[)\s+|\s+(\])/imu', '/(\.+\s+)|(\!+\s+)|(\?+\s+)|(\?\!\s+)/imu', '/(\.+\]\s+)|(\!+\]\s+)|(\?+\]\s+)|(\?\!\]\s+)/imu' ],['', ' ', '', '$1', '$1{:separate:}', '$1{:separate:}'],$text);
                
                // делим
                $text_exploded = explode('{:separate:}',$text);
                return array_slice ($text_exploded,$offset, $length);  
        }
Ловите
Последний в списке регэксп костылирует любимоую "особенность" Льва Николаевича забирать пояснения в квадратные скобки. Его, в принципе, можно убрать.

Интересно взглянуть в глаза программисту, который использует foreach там, где он вообще нафих не нужен. (Может он просто не знает, что есть и другие операторы цикла?)
тут надо for обычный юзать, Он и читается проще и , главное, в данном случае работает зело быстрее.

"пАтиму??"
а вот... Тут или регэексп находит всего два предложения или ...  одно из двух. (с) Колобки

SeVlad #:

Да, кстати. Этот момент я упустил (а ещё троеточия ;) ).

Мало того, есть ещё комбинации вопроса с восклицанием. (?!)
Правила русского языка допускают также три восклицательных знака (!!!)
Мало того, многоточие может не являться окончанием предложения, а быть, например, элементом усекания текста при цитировании.

вообще, комбинаций, мягко говоря, не мало

Так что надо искать знак препинания + 0-n пробелов  с последующей заглавной буковой или коротким тире (если мы говорим о прямой речи ).

Вообще, у нас язык очень тяжел для парсинга.
Особенность русского языка в том, что постановка подлежащего и сказуемого в нашем языке абсолютно не важна. Мы определяем смысл предложения через интонацию, которую в письме передаем через символы пунктуации.

это не самая простая задача, так как у текста могут быть окончания не только на точку. Есть еще вопросительный и восклицательный знаки. Их кол-во тоже может меняться. могут быть и комбинации.
Многие авторы, по доброте душевной, добавляют главы и разделы.
по этой причине текст обычно рубится за несколько проходов. первые 1-n проходов подготовительные, когда убирается вся ненужная информация, а последний проход уже разбиение текста на предложения (абзацы).

если у вас текст стандартизирован. то-есть нет ни вопросительных знаков, ни восклицательных, ни многоточий, то просто прогоняете его explode и готово.
если же у вас "Война и Мир" вот там уже будет конкретная веселуха

двигать надо всё окно (так раньше на UNIX терминалах и делалось. )
то-есть когда происходит изменение контента в окне, проверяете его размер. если размер изменился, сдвигаете.
думаю, что надо смотреть в сторону MutationObserver
https://developer.mozilla.org/ru/docs/Web/API/MutationObserver
Всего: 1685