Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Обрезание строки
Форумы портала PHP.SU » PHP » Регулярные выражения » Обрезание строки

Страниц (1): [1]
 

1. inkor - 15 Июня, 2010 - 21:53:05 - перейти к сообщению
Есть текст (статья) необходимо от начала статьи получить первые минимум 200 симвалов до ближайшего пробела или знака препинания. В общем чтоб слова целиком оставались.
2. Nestor - 15 Июня, 2010 - 22:04:30 - перейти к сообщению
Смотри в сторону wordwrap
3. Joo - 16 Июня, 2010 - 05:18:10 - перейти к сообщению
Вот:
PHP:
скопировать код в буфер обмена
  1. $max = 200;
  2. $test = 'Есть текст (статья) необходимо от начала статьи получить первые минимум 200 симвалов до ближайшего пробела или знака препинания. В общем чтоб слова целиком оставались.';
  3. if(strlen($test)>$max){
  4.     preg_match('/^.{'.$max.',}?\b/', $test, $regs);
  5.     $result = $regs[0];
  6. }else{
  7.     $result = $test;
  8. }
  9. if(strlen($result)!=strlen($test)) $result .=' ...';
  10. echo($result);
4. JustUserR - 16 Июня, 2010 - 12:55:03 - перейти к сообщению
inkor пишет:
Есть текст (статья) необходимо от начала статьи получить первые минимум 200 симвалов до ближайшего пробела или знака препинания. В общем чтоб слова целиком оставались.
Если ваш текст или статья достаточно большого размера и не имеет смысл ее целиком считвать и загружать в память можете поступить так - используете поблочное K-символное считывание и первоначально безусловно считываете N символов а потом в оставляемся блоке берете по символу до тех пора пока не встретите ограничитель слова - это хорошо тем что если текст взятый с внешнего источника автоматически окажется без пробелов или по причине несовпадения кодировок регулярное выражение и строковые функции не сработают как надо то вы получить в крайнем случае текст длиной N+K
5. movEAX - 16 Июня, 2010 - 15:36:28 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $max = 200;
  2. $test = 'Если ваш текст или статья достаточно большого размера и не имеет смысл ее целиком считвать и загружать в память можете поступить так - используете поблочное K-символное считывание и первоначально безусловно считываете N символов а потом в оставляемся блоке берете по символу до тех пора пока не встретите ограничитель слова - это хорошо тем что если текст взятый с внешнего источника автоматически окажется без пробелов или по причине несовпадения кодировок регулярное выражение и строковые функции не сработают как надо то вы получить в крайнем случае текст длиной N+K';
  3.  
  4. // ~0,0000624 сек
  5. while( strlen($test)>$max)
  6.     if(strstr(' .!?,', $test{-1 + $max++})) break;
  7. echo substr($test, 0, --$max);
  8.  
  9. // ~0,0000362 сек
  10. $str = wordwrap($test, $max, '{del}');
  11. echo array_shift(explode('{del}', $str));
  12.  
  13. // ~0,0000484 сек
  14. if(strlen($test)>$max){
  15.     preg_match('/^.{'.$max.',}?\b/', $test, $regs);
  16.     $result = $regs[0];
  17. }else{
  18.     $result = $test;
  19. }
  20. if(strlen($result)!=strlen($test)) $result .=' ...';
  21. echo($result);
  22.  
6. inkor - 16 Июня, 2010 - 19:02:25 - перейти к сообщению
Joo пишет:
Вот:
PHP:
скопировать код в буфер обмена
  1. $max = 200;
  2. $test = 'Есть текст (статья) необходимо от начала статьи получить первые минимум 200 симвалов до ближайшего пробела или знака препинания. В общем чтоб слова целиком оставались.';
  3. if(strlen($test)>$max){
  4.     preg_match('/^.{'.$max.',}?\b/', $test, $regs);
  5.     $result = $regs[0];
  6. }else{
  7.     $result = $test;
  8. }
  9. if(strlen($result)!=strlen($test)) $result .=' ...';
  10. echo($result);


отлично! работает , спасибо
7. Joo - 17 Июня, 2010 - 09:21:28 - перейти к сообщению
inkor пишет:
отлично! работает , спасибо

Не за что Улыбка
8. JustUserR - 17 Июня, 2010 - 11:13:42 - перейти к сообщению
movEAX пишет:
if(strstr(' .!?,', $test{-1 + $max++})) break;
Вероятно данную функцию можно ускорить если не использовать в цикле строковой функции которая как правило работает не очень быстро - например можно попробовать сравнить с несколькими if-ами для данной позиции строки или с in_array для указанного набора символов
Также стоит изменить условие цикла чтобы он не был бесконечным по определению - а например поставить максимальное число с дальнешей безусловной отсчекой строки Ведь если данные берутся из внешнего источника то не исключена проблема с кодировкой - и нужно обезопаситься таким образом чтобы какой-то источник данных с другой кодировкой не создал бесконечный цикл а вместе с ним нагрузку на сервер
9. iNazgul - 03 Сентября, 2011 - 01:52:57 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $max = 200;
  2. $test = 'Есть текст (статья) необходимо от начала статьи получить первые минимум 200 симвалов до ближайшего пробела или знака препинания. В общем чтоб слова целиком оставались.';
  3. if(strlen($test)>$max){
  4.     preg_match('/^.{'.$max.',}?\b/', $test, $regs);
  5.     $result = $regs[0];
  6. }else{
  7.     $result = $test;
  8. }
  9. if(strlen($result)!=strlen($test)) $result .=' ...';
  10. echo($result);

извините а можно этот скриптик под утф-8 кодировку заточить?
10. illy - 04 Сентября, 2011 - 13:49:05 - перейти к сообщению
preg_match('/^.{'.$max.',}?\b/mU', $test, $regs);
11. Champion - 04 Сентября, 2011 - 14:56:44 - перейти к сообщению
illy пишет:
/mU'
Только u должна быть маленькая. Большая - иневертирует жадность. Если ее использовать, то "?" надо будет убрать из решулсяки.
12. OrmaJever - 04 Сентября, 2011 - 15:22:08 - перейти к сообщению

Champion пишет:
решулсяки.

Хи
13. illy - 04 Сентября, 2011 - 15:32:50 - перейти к сообщению
Champion пишет:
Только u должна быть маленькая. Большая - иневертирует жадность.

ошень ценное замечание.
теперь решулсяка норм работать будет Ха-ха

 

Powered by ExBB FM 1.0 RC1