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 :: Версия для печати :: mb_wordwrap
Форумы портала PHP.SU » PHP » Пользовательские функции » mb_wordwrap

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

1. armancho7777777 - 10 Мая, 2013 - 19:34:49 - перейти к сообщению
Данная функция является аналогом функции wordwrap для многобайтовых кодировок.

PHP:
скопировать код в буфер обмена
  1.  
  2. function mb_wordwrap($str, $width = 74, $break = "\r\n", $cut = false)
  3. {
  4.     return preg_replace(
  5.         '~(?P<str>.{' . $width . ',}?' . ($cut ? '(?(?!.+\s+)\s*|\s+)' : '\s+') . ')(?=\S+)~mus',  
  6.         '$1' . $break,
  7.         $str
  8.     );
  9. }
  10.  
  11.  
  12. //  Пример   ----------------------------------------------
  13.  
  14. $str = 'Тут много текста, который надо разбить на части по 26 символов с учётом пробелов.';
  15.  
  16. echo mb_wordwrap($str, 26, "<br>\r\n");
  17.  


P.S. В сети есть решения, но какие-то громоздкие.
2. KingStar - 10 Мая, 2013 - 19:48:56 - перейти к сообщению
wordwrap если строка длинная, то она режет слово, в твоем случае ф-ция режет по пробелам
3. armancho7777777 - 10 Мая, 2013 - 20:13:14 - перейти к сообщению
KingStar пишет:
если строка длинная, то она режет слово

Если передан четвёртый аргумент.
Функция, наоборот, не правильно работала с четвёртым аргументом.
Переделал.
Код выше обновил.
4. KingStar - 10 Мая, 2013 - 20:17:43 - перейти к сообщению
не хочет (((

PHP:
скопировать код в буфер обмена
  1. $str = 'Тут много текстааааааааааааааааааааааааааааааааааааааааааааааааааааааааа, который надо разбить на части по 26 символов с учётом пробелов.';
  2.  
  3. echo mb_wordwrap($str, 26, "<br>\r\n", true);


или какой аргумент должен быть???
5. armancho7777777 - 10 Мая, 2013 - 20:22:01 - перейти к сообщению
Ага, опять что-то не доглядел )
Минутку )
6. LIME - 10 Мая, 2013 - 20:25:49 - перейти к сообщению
мне кажется тут логичнее было бы тупой цикл оформить
должно быстрее получиться
7. armancho7777777 - 10 Мая, 2013 - 20:31:12 - перейти к сообщению
LIME, ну вот Вы с циклом пример скиньте, а я с регуляркой повожусь ))
Посмотрим, что лучше ))
8. LIME - 10 Мая, 2013 - 20:38:42 - перейти к сообщению
причем чем файл больше тем быстрее будет
а мне лениво
я нехочу
регулярки используют нехилые алгоритмы
проще брать энное кол-во символов и сохранять в новую строку через разделитель в цикле
9. armancho7777777 - 10 Мая, 2013 - 20:43:55 - перейти к сообщению
LIME пишет:
а мне лениво

А посты строчить не лениво?
На словах я и эйфелевую башню Вам "нарисую" за 5 сек.
Громоздкий получится код, который съест памяти больше, чем регулярка.
А чтобы не спорить, я и предложил Вам выложить свой пример, а я свой.
И проверим, что потребует меньше ресурсов.
А так это ни что иначе как холивар.
10. LIME - 10 Мая, 2013 - 20:47:17 - перейти к сообщению
это не то что холи
это вообще не вар никакой))
мне пофиг))
11. OrmaJever - 10 Мая, 2013 - 20:59:47 - перейти к сообщению
armancho7777777 пишет:
ну вот Вы с циклом пример скиньте

я готов защитить честь циклов.
PHP:
скопировать код в буфер обмена
  1. $str = 'abcd abcdeg ab abc abcdefg';
  2. $count = 10;
  3. $cut = 1;
  4. for($i=0, $c=$count; isset($str[$i]); ++$i, --$c)
  5. {
  6.         if(!$c) {
  7.                 while(!$cut && isset($str[$i]) && $str[$i] != ' ') echo $str[$i++];
  8.                 echo '<br>';
  9.                 $c = $count;
  10.         }
  11.         echo $str[$i];
  12. }

Код набросан просто для примера, я не знаю как он будет работать с юникодом и всё ли в нём верно, он просто для примера.
12. armancho7777777 - 10 Мая, 2013 - 21:17:56 - перейти к сообщению
OrmaJever, код работает криво.
OrmaJever пишет:
я готов защитить честь циклов.

Так выложите код, который выполнит задачу так же, как стандартная функция wordwrap с использованием функций (конструкций), отличных от регулярок.
Задача не тупо разрезать строку на части в цикле.
13. LIME - 10 Мая, 2013 - 21:17:59 - перейти к сообщению
вот взяли и заставили человека с похмелья писать всякую фигню
PHP:
скопировать код в буфер обмена
  1. public static function main() {
  2.         $time1 = time();
  3.         for ($i = 0; $i < 100000; ++$i) {
  4.             $returnStr = '';
  5.             for ($strLengh = mb_strlen(self::$str), $start = 0, $len = 74; $strLengh - $start >= $len; $start+=$len) {
  6.                 $returnStr.=mb_substr(self::$str, $start, $len) . '~~~~~' . PHP_EOL;
  7.             }
  8.         }
  9.         die(memory_get_peak_usage() . '-' . (time() - $time1) . $returnStr);
  10.     }

свое решение сам подставь и посмотрим результаты
(Добавление)
armancho7777777 пишет:
Задача не тупо разрезать строку на части в цикле.
а какая задача?
14. armancho7777777 - 10 Мая, 2013 - 21:20:57 - перейти к сообщению
LIME пишет:
вот взяли и заставили человека с похмелья писать всякую фигню

LIME пишет:
public static function main() {

Вырезано из контекста какого-то класса.
Ладно, проверим, сравним, если работает как надо.
(Добавление)
LIME пишет:
а какая задача?
armancho7777777 пишет:
код, который выполнит задачу так же, как стандартная функция wordwrap
15. LIME - 10 Мая, 2013 - 21:24:48 - перейти к сообщению
нет тоже хреновое решение
будет какждый раз с начала файла сикать
лучше читать по байту
но точно не сегодня ))

 

Powered by ExBB FM 1.0 RC1