X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость ( Вход | Регистрация )

5 страниц V   1 2 3 4 5 >
Открыть тему
Тема закрыта
> PHP разбить текст по предложениям.
centurion
centurion
Topic Starter сообщение 9.8.2010, 14:18; Ответить: centurion
Сообщение #1


Топовый постер
*******


Группа: Active User
Сообщений: 2831
Регистрация: 10.12.2007
Из: aceweb
Поблагодарили: 1349 раз
Репутация:   308  


Есть тхт файл в нем 5 строк (абзацев) по более ста предложений.
Мне бы его разбить на много абзацев. Чтоб в каждом абзаце было 3-6 предложений.
Можно как-то сделать? Ориентируясь на точки, восклицательные знаки и знаки вопроса. Т.е. ориентируясь на завершение предложения.

Сообщение отредактировал centurion - 9.8.2010, 14:18
8
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
bitrixoid
bitrixoid
сообщение 9.8.2010, 14:55; Ответить: bitrixoid
Сообщение #2


клоновод
******

Группа: Banned
Сообщений: 1951
Регистрация: 27.4.2009
Поблагодарили: 1118 раз
Репутация:   166  


Конечно можно. "В лоб" - заводим счетчик, ищем вхождение {. ? !}, при нахождении увеличиваем счетчик, по достижению "3-6" ставим перенос строки и обнуляем счетчик. Прогоняем единожды по всему файлику.
Не забыть о многоточиях, ну и заранее можно убить все абзацы и сделать текст сплошным. Кодить не буду, сорри, кто нибудь наверняка найдется.


--------------------
клоновод
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Cttr
Cttr
сообщение 9.8.2010, 14:59; Ответить: Cttr
Сообщение #3


Завсегдатай
*****

Группа: Active User
Сообщений: 524
Регистрация: 13.5.2010
Из: Украина, Крым
Поблагодарили: 163 раза
Репутация:   23  


explode в помощь

Сообщение отредактировал Cttr - 9.8.2010, 15:06


--------------------
Помогите спасти девочку
Продвижение неизбежно, когда такая высокая конкуренция
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
DeimosFobos
DeimosFobos
сообщение 9.8.2010, 16:21; Ответить: DeimosFobos
Сообщение #4


Участник
***


Группа: User
Сообщений: 170
Регистрация: 30.4.2010
Из: www
Поблагодарили: 80 раз
Репутация:   25  


Держите:
<?php
$text = file_get_contents('text.txt');
$text = preg_replace("/([.?!])/", "$1{znak}", $text);
$array = explode('{znak}', $text);
$count = count($array);
$randnum = rand(3,6);
$nownum = 0;
$lc = 0;

foreach( $array as $line ) {
    $line = trim($line);
    if($line) {
        if($nownum >= $randnum) {
            $randnum = rand(3,6);
            $nownum = 0;
            $lc++;
        }
        $lines[$lc] .= $line;
        $nownum++;
    }
}
print_r($lines);
?>

$lines: массив с предложениями.

Сообщение отредактировал DeimosFobos - 9.8.2010, 16:22
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
webpavilion
webpavilion
сообщение 9.8.2010, 16:49; Ответить: webpavilion
Сообщение #5


сеошник на пенсии
*******

Группа: Active User
Сообщений: 2726
Регистрация: 28.4.2009
Из: МО
Поблагодарили: 1659 раз
Репутация:   171  


обожаю такие задачки, вот мой вариант:
    $path = 'file.txt';

    $txt = file_get_contents($path);
    $txt = preg_split('#(?<=(\.|\!|\?))\s#s', $txt);
    $txt = array_map("trim", $txt);

    $new = array(); #добавил ибо так правильнее.

    $count = count($txt);
    
    $start = 0;
    $rand = mt_rand(3, 6);
    
    while ($start<=$count) {
        $new[] = implode(' ', array_slice($txt,$start, $rand));
        $start += $rand;
        $rand = mt_rand(3, 6);
    }
    
    echo $last = count($new)-1;
    if ($new[$last] == '') unset ($new[$last]);
    
#    $new - содержит массив с предложениями;


вот сравнение скорости работы с вариантом DeimosFobos:
<?php

ini_set("max_execution_time", "240");
$p = 1000;
$path = 'file.txt';
function r ($timestart,$timestop,$name) {
    global $p;
    echo "$p повторений '$name': ", round(($timestop-$timestart), 3), ' сек.<br>';    
}

$timestart = microtime(true);

$intxt = file_get_contents($path);
for($t = 0; $t < $p; $t++) {
    $txt = preg_split('#(?<=(\.|\!|\?))\s#s', $intxt);
    $txt = array_map("trim", $txt);

    $count = count($txt);
    
    $start = 0;
    $rand = mt_rand(3, 6);
    
    while ($start<=$count) {
        $new[] = implode(' ', array_slice($txt,$start, $rand));
        $start += $rand;
        $rand = mt_rand(3, 6);
    }
    
    $last = count($new)-1;
    if ($new[$last] == '') unset ($new[$last]);
}
r($timestart, microtime(true), 'webpavilion');


$timestart = microtime(true);


$text = file_get_contents($path);
for($t = 0; $t < $p; $t++) {
    $text = preg_replace("/([.?!])/", "$1{znak}", $text);
    $array = explode('{znak}', $text);
    $count = count($array);
    $randnum = rand(3,6);
    $nownum = 0;
    $lc = 0;

    foreach( $array as $line ) {
        $line = trim($line);
        if($line) {
            if($nownum >= $randnum) {
                $randnum = rand(3,6);
                $nownum = 0;
                $lc++;
            }
            $lines[$lc] .= $line;
            $nownum++;
        }
    }
}
r($timestart, microtime(true), 'DeimosFobos');


результат на моем ноутбуке:
1000 повторений 'webpavilion': 1.422 сек.
1000 повторений 'DeimosFobos': 55.84 сек.


содержимое файла с текстом в utf-8:
SWOT-анализ раскручивает потребительский рынок, используя опыт предыдущих кампаний. Продуктовый ассортимент, несмотря на внешние воздействия, интуитивно понятен. Гелиоцентрическое расстояние, сублимиpуя с повеpхности ядpа кометы, просветляет сарос, используя опыт предыдущих кампаний. Часовой угол, в рамках сегодняшних воззрений, синхронно образует астероидный годовой параллакс, таким образом объектом имитации является число длительностей в каждой из относительно автономных ритмогрупп ведущего голоса. Флажолет неравномерен. Стимулирование коммьюнити варьирует терминатор, это довольно часто наблюдается у сверхновых звезд второго типа. Ось, согласно традиционным представлениям, представляет собой длительностный секстант, данное соглашение было заключено на 2-й международной конференции "Земля из космоса - наиболее эффективные решения". Векторно-зеркальная синхронность, и это особенно заметно у Чарли Паркера или Джона Колтрейна, жизненно просветляет целевой сегмент рынка, благодаря широким мелодическим скачкам. Как предсказывают футурологи крещендирующее хождение спонтанно детерминирует терминатор, на этих моментах останавливаются Л.А.Мазель и В.А.Цуккерман в своем "Анализе музыкальных произведений". Как отмечает Майкл Мескон, пуанта изящно гасит социальный статус, таким образом конструктивное состояние всей музыкальной ткани или какой-либо из составляющих ее субструктур (в том числе: временнoй, гармонической, динамической, тембровой, темповой) возникает как следствие их выстраивания на основе определенного ряда (модуса). Зенитное часовое число использует Ганимед, хотя это довольно часто напоминает песни Джима Моррисона и Патти Смит. Кульминация прочно продолжает дорийский эксцентриситет, однако сами песни забываются очень быстро. Бизнес-план последовательно представляет собой радиант, о чем подробно говорится в книге М.Друскина "Ганс Эйслер и рабочее музыкальное движение в Германии". Параллакс сбалансирован.
Иными словами, интервально-прогрессийная континуальная форма индуктивно тормозит флэнжер, хотя это довольно часто напоминает песни Джима Моррисона и Патти Смит. Имидж предприятия, на первый взгляд, перечеркивает непреложный популяционный индекс, но если бы песен было раз в пять меньше, было бы лучше для всех. Флюгель-горн многопланово позиционирует миксолидийский принцип восприятия, а после исполнения Утесовым роли Потехина в "Веселых ребятах" слава артиста стала всенародной. Конечно, нельзя не принять во внимание тот факт, что фаза продуцирует мономерный побочный PR-эффект, не считаясь с затратами. Глиссандо переворачивает мнимотакт, но кольца видны только при 40–50. Раскрутка охватывает хроматический спектральный класс, не считаясь с затратами. Отвесная линия пока плохо продолжает афелий , оптимизируя бюджеты. Действительно, процессуальное изменение поддерживает шоу-бизнес, учитывая, что в одном парсеке 3,26 световых года. Высота прекрасно переворачивает болид , оптимизируя бюджеты. Различное расположение специфицирует вращательный параметр, о чем подробно говорится в книге М.Друскина "Ганс Эйслер и рабочее музыкальное движение в Германии". Весеннее равноденствие , а там действительно могли быть видны звезды, о чем свидетельствует Фукидид решает параллакс, осознав маркетинг как часть производства. Каллисто вызывает контент, данное соглашение было заключено на 2-й международной конференции "Земля из космоса - наиболее эффективные решения". Производство, и это особенно заметно у Чарли Паркера или Джона Колтрейна, изменяет типичный динамический эллипсис, используя опыт предыдущих кампаний.


Сообщение отредактировал webpavilion - 9.8.2010, 17:00


--------------------
Не ведитесь, cамопис это почти всегда плохо!

Делаю сайты на Drupal 7.x
(очень дорого)


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
DeimosFobos
DeimosFobos
сообщение 9.8.2010, 18:40; Ответить: DeimosFobos
Сообщение #6


Участник
***


Группа: User
Сообщений: 170
Регистрация: 30.4.2010
Из: www
Поблагодарили: 80 раз
Репутация:   25  


(webpavilion @ 9.8.2010, 15:49) *
вот сравнение скорости работы с вариантом DeimosFobos:

снова вы и снова вам не получится выставить меня дураком.
мой код работает быстрее вашего.
вы со своими повторами дублируете $text.
я писал код для использования без повторов и не придавал значение названию переменной.
замените :
$text = preg_replace("/([.?!])/", "$1{znak}", $text);
$array = explode('{znak}', $text);

на:
$newtext= preg_replace("/([.?!])/", "$1{znak}", $text);
$array = explode('{znak}', $newtext);

и вот вам результат:
1000 повторений 'webpavilion': 0.521 сек.
1000 повторений 'DeimosFobos': 0.321 сек.

webpavilion хватит пытаться выставить меня дураком, пока вам удается только себя...

Сообщение отредактировал DeimosFobos - 9.8.2010, 18:43


Поблагодарили: (5)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
webpavilion
webpavilion
сообщение 9.8.2010, 20:51; Ответить: webpavilion
Сообщение #7


сеошник на пенсии
*******

Группа: Active User
Сообщений: 2726
Регистрация: 28.4.2009
Из: МО
Поблагодарили: 1659 раз
Репутация:   171  


DeimosFobos, ну зачем так грубо то? покажите где я пытался выставить вас дураком? специально же опубликовал все исходники, что бы вы смогли проверить.

специально через дебагер дома прогнал нашел СВОЮ ошибку.

втом виде что есть сейчас ваш код на 10-15% быстрее, я вот например не знал что preg_splt

медленнее чем preg_replace+explode


--------------------
Не ведитесь, cамопис это почти всегда плохо!

Делаю сайты на Drupal 7.x
(очень дорого)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
DeimosFobos
DeimosFobos
сообщение 9.8.2010, 21:13; Ответить: DeimosFobos
Сообщение #8


Участник
***


Группа: User
Сообщений: 170
Регистрация: 30.4.2010
Из: www
Поблагодарили: 80 раз
Репутация:   25  


(webpavilion @ 9.8.2010, 20:51) *
DeimosFobos, ну зачем так грубо то? покажите где я пытался выставить вас дураком?

да у меня просто осталось ощущение от нашей старой темыsmile.gif, ну если не хотели, извиняюсь за грубость.

Сообщение отредактировал DeimosFobos - 9.8.2010, 21:15


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
webpavilion
webpavilion
сообщение 9.8.2010, 21:26; Ответить: webpavilion
Сообщение #9


сеошник на пенсии
*******

Группа: Active User
Сообщений: 2726
Регистрация: 28.4.2009
Из: МО
Поблагодарили: 1659 раз
Репутация:   171  


(DeimosFobos @ 9.8.2010, 21:13) *
да у меня просто осталось ощущение от нашей старой темыsmile.gif, ну если не хотели, извиняюсь за грубость.

людям свойственно мерится пиписьками, так они устроены. вы написали свой скрипт чуть раньше меня - просто стало интересно у кого быстрее...

кто старое помянет тому пальцем в глаз, я на вас зла не держу.


--------------------
Не ведитесь, cамопис это почти всегда плохо!

Делаю сайты на Drupal 7.x
(очень дорого)


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
centurion
centurion
Topic Starter сообщение 9.8.2010, 21:38; Ответить: centurion
Сообщение #10


Топовый постер
*******


Группа: Active User
Сообщений: 2831
Регистрация: 10.12.2007
Из: aceweb
Поблагодарили: 1349 раз
Репутация:   308  


Спасибо ребята. Уверен будут юзать оба скрипта.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
5 страниц V   1 2 3 4 5 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Веб-разработка (HTML5, CSS3, JavaScript, jQuery, Ajax, PHP)
18 qpPeW 3348 Вчера, 13:32
автор: qpPeW
Открытая тема (нет новых ответов) php скрипты любой сложности / диз+верстка (адаптивно)
любые задачи на php - автоматизация, парсинг, работа с БД
1 affrodita 489 8.12.2017, 17:40
автор: affrodita
Горячая тема (нет новых ответов) Копирайтинг и рерайт: качественный сео-текст по доступной цене!
312 Sostavitel 91009 8.12.2017, 12:30
автор: Sostavitel
Открытая тема (нет новых ответов) Размножить текст
4 azos 358 2.12.2017, 23:37
автор: Emtec
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыImage Optimizer (PHP)
6 bars96 905 17.11.2017, 0:47
автор: bars96


 



RSS Текстовая версия Сейчас: 13.12.2017, 2:09
Дизайн