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 :: mb_wordwrap

 PHP.SU

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


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

> Описание: Аналог функции wordwrap для многобайтовых кодировок
armancho7777777 Супермодератор
Отправлено: 10 Мая, 2013 - 19:34:49
Post Id



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


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


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




Данная функция является аналогом функции 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. В сети есть решения, но какие-то громоздкие.

(Отредактировано автором: 10 Мая, 2013 - 20:12:44)

 
 Top
KingStar
Отправлено: 10 Мая, 2013 - 19:48:56
Post Id



Участник


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


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




wordwrap если строка длинная, то она режет слово, в твоем случае ф-ция режет по пробелам

(Отредактировано автором: 10 Мая, 2013 - 19:54:48)



-----
То что программа работает, не означает что она написана правильно!
 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Мая, 2013 - 20:13:14
Post Id



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


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


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




KingStar пишет:
если строка длинная, то она режет слово

Если передан четвёртый аргумент.
Функция, наоборот, не правильно работала с четвёртым аргументом.
Переделал.
Код выше обновил.

(Отредактировано автором: 10 Мая, 2013 - 20:17:05)

 
 Top
KingStar
Отправлено: 10 Мая, 2013 - 20:17:43
Post Id



Участник


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


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




не хочет (((

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


или какой аргумент должен быть???


-----
То что программа работает, не означает что она написана правильно!
 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Мая, 2013 - 20:22:01
Post Id



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


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


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




Ага, опять что-то не доглядел )
Минутку )
 
 Top
LIME
Отправлено: 10 Мая, 2013 - 20:25:49
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




мне кажется тут логичнее было бы тупой цикл оформить
должно быстрее получиться
 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Мая, 2013 - 20:31:12
Post Id



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


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


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




LIME, ну вот Вы с циклом пример скиньте, а я с регуляркой повожусь ))
Посмотрим, что лучше ))
 
 Top
LIME
Отправлено: 10 Мая, 2013 - 20:38:42
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




причем чем файл больше тем быстрее будет
а мне лениво
я нехочу
регулярки используют нехилые алгоритмы
проще брать энное кол-во символов и сохранять в новую строку через разделитель в цикле

(Отредактировано автором: 10 Мая, 2013 - 20:39:12)

 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Мая, 2013 - 20:43:55
Post Id



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


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


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




LIME пишет:
а мне лениво

А посты строчить не лениво?
На словах я и эйфелевую башню Вам "нарисую" за 5 сек.
Громоздкий получится код, который съест памяти больше, чем регулярка.
А чтобы не спорить, я и предложил Вам выложить свой пример, а я свой.
И проверим, что потребует меньше ресурсов.
А так это ни что иначе как холивар.

(Отредактировано автором: 10 Мая, 2013 - 20:45:23)

 
 Top
LIME
Отправлено: 10 Мая, 2013 - 20:47:17
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




это не то что холи
это вообще не вар никакой))
мне пофиг))
 
 Top
OrmaJever
Отправлено: 10 Мая, 2013 - 20:59:47
Post Id



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


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


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




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. }

Код набросан просто для примера, я не знаю как он будет работать с юникодом и всё ли в нём верно, он просто для примера.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Мая, 2013 - 21:17:56
Post Id



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


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


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




OrmaJever, код работает криво.
OrmaJever пишет:
я готов защитить честь циклов.

Так выложите код, который выполнит задачу так же, как стандартная функция wordwrap с использованием функций (конструкций), отличных от регулярок.
Задача не тупо разрезать строку на части в цикле.
 
 Top
LIME
Отправлено: 10 Мая, 2013 - 21:17:59
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




вот взяли и заставили человека с похмелья писать всякую фигню
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 пишет:
Задача не тупо разрезать строку на части в цикле.
а какая задача?
 
 Top
armancho7777777 Супермодератор
Отправлено: 10 Мая, 2013 - 21:20:57
Post Id



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


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


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




LIME пишет:
вот взяли и заставили человека с похмелья писать всякую фигню

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

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


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




нет тоже хреновое решение
будет какждый раз с начала файла сикать
лучше читать по байту
но точно не сегодня ))
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB