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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Корректная обрезка строк
Проблема этого кода в том, что он неправильно работает с кодировкой utf-8, если символы отличаются от латиницы, и исходит эта проблема из-за того, что с многобайтными символами функция substr работать не умеет. Заменяю её на mb_substr:
Остаётся одна проблема: слова обрезаются посередине, получается ерунда вроде "Слова обрезаются посе...". Подскажите, какие функции можно применить, чтобы текст обрезался правильно: "Слова обрезаются посередине...".
Буду очень благодарен за примеры!
JustUserR
Отправлено: 11 Июня, 2010 - 15:10:42
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
StormMan пишет:
Остаётся одна проблема: слова обрезаются посередине, получается ерунда вроде "Слова обрезаются посе...". Подскажите, какие функции можно применить, чтобы текст обрезался правильно: "Слова обрезаются посередине...".
Для того чтобы не обрезать слова по середине нужно определиться с символов который является границей слова это может быть пробел и знаки пунктуации - соответственно вы можете получить индекс $v последнего символа в вашей функции но саму строку не обрезать - а запустить цикл который будет по очереди проверять символы и если они не являются символами границы слова то прибавлять значение $v на единицу Соответственно когда цикл завершится то вы получите значение $v по которому можно обрезать подстроку
Похожую задачу можно решить и в регулярном выражении за счет функции просмотра вперед
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
ZeiZ
Отправлено: 11 Июня, 2010 - 16:07:54
Частый гость
Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009 Откуда: Москва
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
ZeiZ пишет:
Это сходу, не проверял, но должно работать
Работать должно но для больших текстов это достаточно медленное и ресурсоемкое решение - ведь потребуется в два раза болье памяти поскольку будет создан массив со словами текста а также разбивка осуществляется достаточно медленно Именно поэтому лучше делать разбивку индуктивно - то есть сразу получить небольшую часть текста в заданных пределах и уже внутри нее выполнять определенные операции
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
ZeiZ
Отправлено: 11 Июня, 2010 - 16:22:13
Частый гость
Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009 Откуда: Москва
Помог: 0 раз(а)
JustUserR разумеется речь идёт о небольших текстах.
JustUserR
Отправлено: 11 Июня, 2010 - 16:57:38
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
ZeiZ пишет:
JustUserR разумеется речь идёт о небольших текстах.
В таком случае использование похожего алгортма весьма возможно только нужно учитываь не количетсво слов а количество символов - поэтому можно создать переменную в которой будет храниться результурующее значение и в цикле можно конкатериовать в нее по слову пока значение не превысит заданной длины
Также хорошо делать проверку на тот случай если входящий текст вообще не будет содержать пробелов (Если текст берется автоматически из какого-то источника) - и в таком случае нужно ввести принудительную длину по которой он будет образеться
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
ZeiZ
Отправлено: 11 Июня, 2010 - 17:13:50
Частый гость
Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009 Откуда: Москва
Помог: 0 раз(а)
JustUserR спасибо, поправлю свой код, проверю скорость, отпишу.
JustUserR
Отправлено: 13 Июня, 2010 - 12:46:03
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
ZeiZ пишет:
JustUserR спасибо, поправлю свой код, проверю скорость, отпишу.
Пожалуйста! Могу вам привести тот PHP-код на основе вашего - который лишен вышеукзаанного недостатка и некоторых семантических ошибок
Если улучшать данную задачу далее то можно было бы проводить дополнительный синтаксический анализ текста - чтобы оно к примеру заканчивалось завершенным предложением или его частью - но это уже достаточно сложный грамматический анализ
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
dahelp
Отправлено: 08 Сентября, 2011 - 09:02:45
Новичок
Покинул форум
Сообщений всего: 1
Дата рег-ции: Сент. 2011
Помог: 0 раз(а)
JustUserR пишет:
Пожалуйста! Могу вам привести тот PHP-код на основе вашего - который лишен вышеукзаанного недостатка и некоторых семантических ошибок
"..." ставит! если текст меньше $symbs. Как дописать функцию, чтобы если $text < $symbs не дописывал "..."?
EuGen
Отправлено: 08 Сентября, 2011 - 09:06:40
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Пожалуйста, в новую тему - эта устарела
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.