PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: как сделать?
inkor
Отправлено: 15 Июня, 2010 - 21:53:05
Post Id


Новичок


Покинул форум
Сообщений всего: 47
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




Есть текст (статья) необходимо от начала статьи получить первые минимум 200 симвалов до ближайшего пробела или знака препинания. В общем чтоб слова целиком оставались.
 
 Top
Nestor
Отправлено: 15 Июня, 2010 - 22:04:30
Post Id



Частый гость


Покинул форум
Сообщений всего: 220
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Смотри в сторону wordwrap


-----
Aurus CMS
 
 Top
Joo
Отправлено: 16 Июня, 2010 - 05:18:10
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2009  
Откуда: Казахстан


Помог: 1 раз(а)




Вот:
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);


-----
"Им будет не просто, тем кто полагается на истину авторитета, вместо ​того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог
 
 Top
JustUserR
Отправлено: 16 Июня, 2010 - 12:55:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




inkor пишет:
Есть текст (статья) необходимо от начала статьи получить первые минимум 200 симвалов до ближайшего пробела или знака препинания. В общем чтоб слова целиком оставались.
Если ваш текст или статья достаточно большого размера и не имеет смысл ее целиком считвать и загружать в память можете поступить так - используете поблочное K-символное считывание и первоначально безусловно считываете N символов а потом в оставляемся блоке берете по символу до тех пора пока не встретите ограничитель слова - это хорошо тем что если текст взятый с внешнего источника автоматически окажется без пробелов или по причине несовпадения кодировок регулярное выражение и строковые функции не сработают как надо то вы получить в крайнем случае текст длиной N+K


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
movEAX
Отправлено: 16 Июня, 2010 - 15:36:28
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




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.  


-----
армия.. самое убогое место
 
 Top
inkor
Отправлено: 16 Июня, 2010 - 19:02:25
Post Id


Новичок


Покинул форум
Сообщений всего: 47
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




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);


отлично! работает , спасибо
 
 Top
Joo
Отправлено: 17 Июня, 2010 - 09:21:28
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2009  
Откуда: Казахстан


Помог: 1 раз(а)




inkor пишет:
отлично! работает , спасибо

Не за что Улыбка


-----
"Им будет не просто, тем кто полагается на истину авторитета, вместо ​того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог
 
 Top
JustUserR
Отправлено: 17 Июня, 2010 - 11:13:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




movEAX пишет:
if(strstr(' .!?,', $test{-1 + $max++})) break;
Вероятно данную функцию можно ускорить если не использовать в цикле строковой функции которая как правило работает не очень быстро - например можно попробовать сравнить с несколькими if-ами для данной позиции строки или с in_array для указанного набора символов
Также стоит изменить условие цикла чтобы он не был бесконечным по определению - а например поставить максимальное число с дальнешей безусловной отсчекой строки Ведь если данные берутся из внешнего источника то не исключена проблема с кодировкой - и нужно обезопаситься таким образом чтобы какой-то источник данных с другой кодировкой не создал бесконечный цикл а вместе с ним нагрузку на сервер


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
iNazgul
Отправлено: 03 Сентября, 2011 - 01:52:57
Post Id



Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Сент. 2011  
Откуда: Смоленск


Помог: 0 раз(а)




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 кодировку заточить?


-----
Суровый отаку>_<
 
 Top
illy
Отправлено: 04 Сентября, 2011 - 13:49:05
Post Id



Участник


Покинул форум
Сообщений всего: 1117
Дата рег-ции: Июль 2011  
Откуда: от верблюда)


Помог: 28 раз(а)




preg_match('/^.{'.$max.',}?\b/mU', $test, $regs);


-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
Champion Супермодератор
Отправлено: 04 Сентября, 2011 - 14:56:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




illy пишет:
/mU'
Только u должна быть маленькая. Большая - иневертирует жадность. Если ее использовать, то "?" надо будет убрать из решулсяки.
 
 Top
OrmaJever
Отправлено: 04 Сентября, 2011 - 15:22:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)





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

Хи


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
illy
Отправлено: 04 Сентября, 2011 - 15:32:50
Post Id



Участник


Покинул форум
Сообщений всего: 1117
Дата рег-ции: Июль 2011  
Откуда: от верблюда)


Помог: 28 раз(а)




Champion пишет:
Только u должна быть маленькая. Большая - иневертирует жадность.

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


-----
Всё гениальное - просто
И ещё проще, если ты - индиго
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB