За последние 24 часа нас посетили 17505 программистов и 1716 роботов. Сейчас ищут 1816 программистов ...

Как обрезать текст по границам слов

Тема в разделе "PHP для новичков", создана пользователем ricciotto, 23 авг 2007.

  1. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    stas_t, тогда обрежится и по запятой. А смысл в том, чтобы выдать анонс текста корректно. Как я понял из первого поста.
     
  2. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    lexa
    а если в тексте вообще нет символов .!;? то подобный вариант выдаст всю строку до конца
     
  3. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    stas_t, всё-таки, имхо, ты не очень понял цель, а не я :). Нужен анонс, а это значит, что: 100% есть текст, 100% в тексте будет знак препинания означающий логический конец (точка, знак вопроса, etc) - ох уж эти правила русского языка. :)

    З.Ы. Ты ещё ошибся насчёт "длиной не менее 150 символов". Система иная: вырезать первые 150 символов, но если до знака больше, то вырезать вплоть до первого знака. (Например 156 знаков в итоге, а не ровно 150.)

    З.З.Ы. Странный тест. Строка в 375 знаков обрабатывается 8 секунд? На калькуляторе? :)

    PHP:
    1. $pgt = microtime(true);
    2. $str = 'Я посмотрел свои заметки, и они мне не понравились. Те три дня, которые я провел на предприятиях фирмы «Ю С. Роботс», я мог бы с таким же успехом просидеть дома, изучая энциклопедию.
    3. Как мне сказали, Сьюзен Кэлвин родилась в 1982 году. Значит, теперь ей семьдесят пять. Это известно каждому. Фирме «Ю С. Роботс энд Мекэникел Мэн Корпорэйшн» тоже семьдесят пять лет. Именно в тот год, когда родилась доктор Кэлвин, Лоуренс Робертсби основал предприятие, которое со временем стало самым необыкновенным промышленным гигантом в истории человечества. Но и это тоже известно каждому.
    4. В двадцать лет Сьюзен Кэлвин присутствовала на том самом занятии семинара по психоматематике, когда доктор Альфред Лэннинг из «Ю. С. Роботс» продемонстрировал первого подвижного робота, обладавшего голосом. Этот большой, неуклюжий, уродливый робот, от которого разило машинным маслом, был предназначен для использования в проектировавшихся рудниках на Меркурии. Но он умел говорить, и говорить разумно.
    5. На этом семинаре Сьюзен не выступала. Она не приняла участия и в последовавших за ним бурных дискуссиях. Мир не нравился этой малообщительной, бесцветной и неинтересной девушке с каменным выражением и гипертрофированным интеллектом, и она сторонилась людей.
    6. Но, слушая и наблюдая, она уже тогда почувствовала, как в ней холодным пламенем загорается увлечение.
    7. В 2005 году она окончила Колумбийский университет, в поступила в аспирантуру по кибернетике.
    8. Изобретенные Робертсоном позитронные мозговые связи превзошли все достигнутое в середине XX века в области вычислительных машин и совершили настоящий переворот. Целые мили реле и фотоэлементов уступили место пористому платиноиридиевому шару размером с человеческий мозг.
    9. Сьюзен научилась рассчитывать необходимые параметры, определять возможные значения переменных позитронного «мозга» и разрабатывать такие схемы, чтобы можно было точно предсказать его реакцию на данные раздражители.';
    10. preg_match("/.{150}[^.!;?]*[.!;?]/si", $str.". ", $matches);
    11. $str = $matches[0];
    12. echo (microtime(true) - $pgt);
    На выходе 0.0001060962677. У меня Атлон64 3500+ и 2 гигабайта оперативки.
    В цикле 1000 раз: 0.0170958042145.

    Возможно, ты получил как результат что-то типа "8.69820404053E-005", но это не микросекунды. И 5 это не секунд :).

    Как ты провёл тест и чем?

    preg_* - быстрые функции. Злоупотреблять регекспами не нужно это верно. Но избегать их даже в тех случаях, для которых они созданы - не правильно.
     
  4. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    lexa
    вопрос был:
    я так понял (я не претендую на конгениальность, но по-русски понимаю без словаря), что максимальное количество символов нельзя перебирать. в вашем же примере не существует верхней границы. нижняя существует -- 150. то есть, если длина строки менее 150, она вообще не совпадёт.

    это и есть "длиной не менее 150 символов". в чём я ошибся?

    ценю ваш юмор.

    рад за вас. у меня PowerPC 700 и 750 метров памяти. как вы, вероятно, понимаете, быстродействие конкретно моей или вашей машины никакого значения не имеет, потому что у каждого свои характеристики. именно поэтому, если мы пытаемся выяснить скорость выполнения определённой операции, мы делаем это относительно скорости выполнения некоторой эталонной операции. в моём примере эталон был -- операция присваивания. если вы посмотрите на результат, то увидите, что позиция empty имеет вес 1.00. это не секунды, это цена операции. вес остальных операций расчитывается относительно этого эталона. считайте, что цена присваивания строки из 375 символов равна 1 рублю. тогда цена кода №2 = 5 рублей 70 копеек. самая дорогая операция -- регулярка в коде № 4 (8,85). это не секунды, это разы. по идее, если вы повторите данные замеры на вашей машине, то получите те же самые коэффициенты. скорость выполнения будет, конечно, другая (ваша машинка управится секунд за 5), но распределение должно сохраниться. а может даже и php-версия выйдет в лидеры (если пятая версия оптимальней четвёрки). попробуем? ща выложу код...
     
  5. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    PHP:
    1. <?php   // BENCHMARK.PHP
    2.  
    3. function microtime_float ($mt)
    4. {
    5.     list ($usec, $sec) = explode (' ', $mt);
    6.     return ((float)$usec + (float)$sec);
    7. }
    8.  
    9. define ('LOOP_MAX', 200000);
    10.  
    11. $bench_name = 'wordwrap first N characters';
    12.  
    13.  
    14.  
    15. // preconfiguration for code snippets
    16. define ('MAX_WIDTH', 100);
    17. $str = 'Here we got a very very long string which is repeated multiple times to produce a more native look of a news line paragraph. Here we got a very very long string which is repeated multiple times to produce a more native look of a news line paragraph. Here we got a very very long string which is repeated multiple times to produce a more native look of a news line paragraph.';
    18. $a = '';
    19. // /preconfiguration for code snippets
    20.  
    21. // empty cycle... warming up
    22. for ($i = 0; $i < LOOP_MAX; $i++)
    23. {
    24.     $a = $str;
    25. }
    26.  
    27. $t0 = microtime ();
    28.  
    29. // measuring empty cycle
    30. for ($i = 0; $i < LOOP_MAX; $i++)
    31. {
    32.     $a = $str;
    33. }
    34.  
    35. $t1 = microtime ();
    36.  
    37. // code snippet 1
    38. for ($i = 0; $i < LOOP_MAX; $i++)
    39. {
    40.     for ($length = MAX_WIDTH
    41.         ; $str[$length] !== ' ' and $length
    42.         ; $length--
    43.         );
    44.     $a = substr ($str, 0, $length);
    45. }
    46.  
    47. $t2 = microtime ();
    48.  
    49. // code snippet 2
    50. for ($i = 0; $i < LOOP_MAX; $i++)
    51. {
    52.     $a = substr ($str, 0, MAX_WIDTH-strlen (strrchr (substr ($str, 0, MAX_WIDTH), ' ')));
    53. }
    54.  
    55. $t3 = microtime ();
    56.  
    57. // code snippet 3
    58. for ($i = 0; $i < LOOP_MAX; $i++)
    59. {
    60.     list ($a) = explode ('<br>', wordwrap (substr ($str, 0, MAX_WIDTH+1), MAX_WIDTH, '<br>', false));
    61. }
    62.  
    63. $t4 = microtime ();
    64.  
    65. // code snippet 4
    66. for ($i = 0; $i < LOOP_MAX; $i++)
    67. {
    68.     preg_match ('/^.{0,'.MAX_WIDTH.'}\W/', $str, $matches);
    69.     $a = substr ($matches[0], 0, -1);
    70. }
    71.  
    72. $t5 = microtime ();
    73.  
    74. $t0 = microtime_float ($t0);
    75. $t1 = microtime_float ($t1);
    76. $t2 = microtime_float ($t2);
    77. $t3 = microtime_float ($t3);
    78. $t4 = microtime_float ($t4);
    79. $t5 = microtime_float ($t5);
    80.  
    81. $d0 = $t1-$t0;
    82. $d1 = $t2-$t1;
    83. $d2 = $t3-$t2;
    84. $d3 = $t4-$t3;
    85. $d4 = $t5-$t4;
    86.  
    87. $k0 = $d0;
    88.  
    89. printf ("<pre>bench name: %s\n"
    90.     . " empty  : %5.2f\n"
    91.     . "snippet1: %5.2f\n"
    92.     . "snippet2: %5.2f\n"
    93.     . "snippet3: %5.2f\n"
    94.     . "snippet4: %5.2f\n\n"
    95.     . "total time: %5.2f sec.\n"
    96.     . "php ver: %s<br>os: %s</pre>"
    97.     , $bench_name
    98.     , $d0/$k0
    99.     , $d1/$k0
    100.     , $d2/$k0
    101.     , $d3/$k0
    102.     , $d4/$k0
    103.     , $t5-$t0
    104.     , PHP_VERSION
    105.     , PHP_OS
    106.     );
    107.  
    108. ?>
     
  6. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Вы так на "вы", что мне стало неудобно "тыкать". Может, всё же на "ты"?

    Vista и Денвер.

    З.Ы. Про процессор и память я сказал потому что в тестах их всегда озвучивают. Вот и я хотел "как большой" :).
     
  7. Anonymous

    Anonymous Guest

    Херовый какой-то у тебя Атлон... мой старый Семпрон и то быстрей )

     
  8. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Горбунов Олег, четверть-половину (скачит) процессорного времени и половину оперативной памяти ест Виста. Но она такая красивенькая :).
     
  9. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    однако, тенденция. в пятёрке "ручной" вариант подсчёта однозначно вышел на первое место. блин, можно было предположить, что разработчики не только новые фичи навешивают, но и оптимизируют всю инфраструктуру...

    lexa
    ты мог бы отключить все красивости висты и прогнать замеры ещё раз? уж очень нереально они у тебя выглядят. не знаю как в висте, а в хп в панели управления есть возможность настройки на "максимальную красивость" или "максимальную производительность". по идее на твоей машине тест не должен превышать 7-8 секунд... и ещё, прогони их раз 10, чтобы убедиться, что значения не пляшут.
     
  10. Anonymous

    Anonymous Guest

    Вот почему виста - сакс. Как можно работать в ОСи, которой только для себя гиг памяти нужно??
     
  11. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    и вся фишка в том, что память уходит на те самые красивости, которые нам нафиг не нужны...
     
  12. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    молча:) Чего все к красивостям цепляются. А то что там, например, идет проверка кодобезопасности выполнения процесса никого не интересует... Не нравятся красивости - их можно отключить. Хотя если вместо компьютера печатная машинка, чтобы в блокноте скрипты для пхп писать - то да, согласен, виста суксь и все такое:)
     
  13. Veem

    Veem Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    76
    Симпатии:
    0
    antonn
    Молча вряд ли получится ;)
    А Виста и с отключенными красивостями жрет немало. У меня, например, лишней памяти нет, а докупать что-то к машине, чтобы на ней заработала не нужная мне ОСь... мде.
     
  14. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    ну никотж ведь не заставляет на нее переходить. Я проблем с производительностью у себя не замечал :)
    Виндовоз тоже ругали, когда она вышла, что тормозит и требует крутое железо. Со временем печатные машинки пополамаются, и придется взять нормальный комп.
    кстати, на 1Гб виста работала без проблем, с включенным Аеро, игралось в bf2142 нормально...
     
  15. Veem

    Veem Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    76
    Симпатии:
    0
    lexa, действительно, хотелось бы увидеть результат прогона с отключенными "красивостями".

    antonn
    512Мб у меня, вроде не печатная машинка. И пока ни для чего, кроме Висты, больше не требуется.
    А виндовоз и сейчас ругают. Причем, вполне заслуженно, на мой взгляд. Но только все равно это личное дело каждого, не будем тут холивор разводить ;)
     
  16. Штаны

    Штаны Guest

    А если проверки поменять местами? А то закономерность просматривается. Чем дальше, тем туже :) Типа уменьшается объем оперативной памяти, т.к. нужно хранить предыдущее.
     
  17. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    поменяйте. и запостите результаты, если не трудно
     
  18. Штаны

    Штаны Guest

    У меня:
    bench name: wordwrap first N characters
    empty : 1.00
    snippet2: 9.12
    snippet3: 17.16
    snippet4: 26.56
    snippet1: 7.73

    total time: 9.93 sec.
    php ver: 5.2.1
    os: WINNT

    У хостера на сервере:
    bench name: wordwrap first N characters
    empty : 1.00
    snippet2: 8.84
    snippet3: 22.47
    snippet4: 15.84
    snippet1: 6.74

    total time: 7.54 sec.
    php ver: 4.4.7
    os: FreeBSD

    Т.е. 1-ый вариант впереди даже если он последний. А вот что интересно, у хостера 3-ий вариант работает дольше, чем 4-й.
     
  19. Штаны

    Штаны Guest

    А вот еще у того же хостера. Здесь уже третий вариант победил не только 4-ый но даже 2-ой.
    bench name: wordwrap first N characters
    empty : 1.00
    snippet1: 6.44
    snippet2: 10.94
    snippet3: 7.36
    snippet4: 12.47

    total time: 7.64 sec.
    php ver: 4.4.7
    os: FreeBSD
     
  20. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    Штаны
    гонять замеры на расшаренном сервере бессмысленно. вы никогда не знаете, сколько подключений в каждый конкретный момент обрабатывает сервер. например, если в середине теста пришло новое подключение, скорость обработки для конкретного скрипта упадёт. к тому же если хостер узнает, что ваши скрипты грузят сервак на 100% (что и происходит в случае замера производительности), он вообще может вас отключить. и правильно сделает.

    внимание для всех, кто будет гонять тесты. не делайте этого на хостинге! тесты загружают сервер на 100%!

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

    ну вот как-то так... типа легальная отмаза
     
  21. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. [Sergey89@localhost html]$ php benchmark.php
    2. bench name: wordwrap first N characters
    3. empty  :  1.00
    4. snippet1:  7.64
    5. snippet2:  9.84
    6. snippet3: 15.38
    7. snippet4: 16.71
    8.  
    9. total time:  6.06 sec.
    10. php ver: 5.2.1
    11. os: Linux
    12. [root@localhost html]# uname -a
    13. Linux localhost 2.6.17-13mdv #1 SMP Fri Mar 23 19:03:31 UTC 2007 i686 Intel(R) Pentium(R) 4 CPU 1.70GHz GNU/Linux
     
  22. mmaavv

    mmaavv Активный пользователь

    С нами с:
    25 мар 2007
    Сообщения:
    59
    Симпатии:
    0
    на локале (винда без красивостей)
    На серваке:
    stas_t
    на серваке тест загружает только один процессор.
     
  23. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Я тоже хочу :)
    Код (Text):
    1. alex:/home/alex# php benchmark.php
    2. bench name: wordwrap first N characters
    3.  empty  :  1.00
    4. snippet1:  7.55
    5. snippet2:  8.82
    6. snippet3: 16.16
    7. snippet4: 22.43
    8.  
    9. total time:  7.95 sec.
    10. php ver: 5.2.0-8+etch7
    11. os: Linux
    P3M 1,2GHz
     
  24. Штаны

    Штаны Guest

    А это как?
     
  25. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. cmd> php benchmark.php