Строки

Работа со строками. Использование wordwrap. Что-то с кодировкой

Имеется такая вот готовая, самостоятельно написанная мной программа.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
    Введите строку = 
echo "

Строка: " . $_POST["string"] . "

"
; $string = $_POST["string"]; $dlina = mb_strlen($string); if ($dlina 3) { echo "Стркока слишком короткая"; } else { echo "

Ответ: ". wordwrap($string,3,"E",1) . "

"
; } ?>

Результат на английской раскладке:

Строка: CyberForumIT
Ответ: CybEerFEoruEmIT

Строка: Информатика
Ответ: И�E�фEо�E�мEа�E�иEк�E�

В чем заключается проблема? Что то с кодировкой?

Работа со строками (использование цикла с параметром)
Дано слово. Поменять местами первую из букв а и последнюю из букв о. Учесть возможность того, что.

Работа с WordWrap в VBA
Ребята, извините за настолько нелепый вопрос, но все же: Есть ли возможность работать в VBA Access.

Использование компонент ввода-вывода. Работа со строками
Ввести произвольную последовательность символов, предшествующую символу ! и выяснить, есть ли среди.

Работа со строками (что-то не дописал)
условие: Вывести в строку АаБбВвГг: Private Sub Command1_Click() Label1.Caption = "" vivod End.

вероятно все дело в том что русские символы занимают по 2 байта в то время как английские по 1 байту в кодировке utf-8

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
function utf8_wordwrap($str, $width, $break, $cut = false)  if (!$cut)  $regexp = '#^(?:[\x00-\x7F] else { $regexp = '#^(?:[\x00-\x7F] if (function_exists('mb_strlen')) { $str_len = mb_strlen($str,'UTF-8'); } else { $str_len = preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty); } $while_what = ceil($str_len / $width); $i = 1; $return = ''; while ($i  $while_what) { preg_match($regexp, $str,$matches); $string = $matches[0]; $return .= $string.$break; $str = substr($str, strlen($string)); $i++; } return $return.$str; }

Лучший ответ

Сообщение было отмечено SmeRT59 как решение

Решение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
function utf8_wordwrap($str, $width, $break, $cut = false)  // Если параметр cut установлен в TRUE, строка всегда будет переноситься на указанной ширине width или раньше. Поэтому, если исходная строка содержит слово длиннее заданной ширины строки, то оно будет разорвано. if (!$cut)  $regexp = '#^(?:[\x00-\x7F] // Если установлен в FALSE, функция не разрезает слово даже если width меньше длины слова. else { $regexp = '#^(?:[\x00-\x7F] // проверяет существует ли функция определения количества символов если есть, то: if (function_exists('mb_strlen')) { $str_len = mb_strlen($str,'UTF-8'); } // если нету: else { $str_len = preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty); } // считает сколько циклов нужно пройти и округляет: $while_what = ceil($str_len / $width); $i = 1; $return = ''; // разбивает строку по указанным параметрам: while ($i  $while_what) { preg_match($regexp, $str,$matches); $string = $matches[0]; $return .= $string.$break; $str = substr($str, strlen($string)); $i++; } // возвращает результат: return $return.$str; }

Да уж. Вроде такая мелочь, но требует такую функцию. 90 процентов я все равно не понял, так как preg_match_all, preg_match, ceil еще не знаю, но думаю до меня когда нибудь дойдет) Спасибо!

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
    Введите строку = 
echo "

Строка: " . $_POST["string"] . "

"
; $str = $_POST["string"]; $str_len = mb_strlen($str); if ($str_len 3) { echo "Строка слишком короткая"; } else { echo "

Ответ без использования функции кодировки: ". wordwrap($str,3,"E",1) . "

"
; } function utf8_wordwrap($str, $width, $break, $cut = false) if (!$cut) $regexp = '#^(?:[\x00-\x7F] else { $regexp = '#^(?:[\x00-\x7F] if (function_exists('mb_strlen')) { $str_len = mb_strlen($str,'UTF-8'); } else { $str_len = preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty); } $while_what = ceil($str_len / $width); $i = 1; $return = ''; while ($i $while_what) { preg_match($regexp, $str,$matches); $string = $matches[0]; $return .= $string.$break; $str = substr($str, strlen($string)); $i++; } return $return.$str; } echo "

Ответ с функцией, исправляющая кодировку: ". utf8_wordwrap($str,3,"E",1) . "

"
; ?>

Источник

wordwrap

wordwrap — Выполняет перенос строки на данное количество символов с использованием символа разрыва строки.

Описание

Возвращает строку str с переносом в столбце с номером, заданном аргументом width. Строка разбивется с помощью аргумента break.

Аргументы width и break необязательны и по умолчанию равны 75 и ‘\n’ соответственно.

Если аргумент cut установлен в 1, разрыв делается точно в заданной колонке. Поэтому если исходная строка содержит слово длиннее, чем заданная длина, то в этом случае слово будет разорвано. (См. второй пример).

Замечание: Необязательный аргумент cut был добавлен в PHP 4.0.3

Пример 1. Пример использования wordwrap()
$text = "The quick brown fox jumped over the lazy dog."; $newtext = wordwrap($text, 20, "
\n"); echo "$newtext";
The quick brown fox 
jumped over the lazy
dog.
Пример 2. Пример использования wordwrap()
$text = "Очень длинное слоооооооооооооооово."; $newtext = wordwrap($text, 8, " ", 1); echo "$newtext\n";
Очень длинное слоооооо оооооооо оово.
Пример 3. wordwrap() с поддержкой UTF-8
function utf8_wordwrap($str, $len = 75, $break = "\n", $cut=false)< if(empty($str)) return ""; $pattern=""; if(!$cut) $pattern="/(\S)/u"; else $pattern="/(.)/u"; return preg_replace($pattern, "\$".$break, $str); >

Смотрите также описание функций nl2br() и chunk_split() .

Источник

Php wordwrap utf 8

В utf-8 с русскими символами работает , но режет русские символы по длине $n/2

Нашел рабочий вариант с использованием iconv():

$mes = iconv("cp1251", "UTF-8", $mes);
$mes = wordwrap($mes, $n, " ", 1);
$mes = iconv("UTF-8", "cp1251", $mes);

Таким способом функция режет русские символы по длине $n/4

Подскажите что можно сделать чтоб и русские символы и все остальные резать одинаково. И как рациональнее это сделать.
Зарание спасибо.

_____________
Процесс написания своего велосипеда повышает профессиональный уровень программиста.

Цитата (aH6y @ 14.12.2010 — 03:56)
$mes = iconv(«cp1251», «UTF-8», $mes);
$mes = wordwrap($mes, $n, » «, 1);
$mes = iconv(«UTF-8», «cp1251», $mes);

kirik
Я знаю, просто привёл пример того, что Я искал.

_____________
Процесс написания своего велосипеда повышает профессиональный уровень программиста.

$mes = iconv("UTF-8", "cp1251", $mes);
$mes = wordwrap($mes, $n, " ", 1);
$mes = iconv("cp1251", "UTF-8", $mes);

В мануале слишком жестоко, что буде если текст размера хотя бы в несколько метров.

linker
Пример не мой
kirik
Спасибо работает

_____________
Процесс написания своего велосипеда повышает профессиональный уровень программиста.

Не в этом случае.
Та функция
а) большая
б) ресурсоемкая (посимвольный анализ для php зло)
в) не работает 🙂

Вот полный аналог для utf-8

function mbWordwrap($str, $width = 74, $break = "\n", $cut = false) 

return preg_replace('#([\S\s]. $width .'>'. ($cut ? '' : '\s') .')#u', '$1'. $break , $str);
>

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться — его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image

Твоя функция в 20 раз быстрее)

_____________
Процесс написания своего велосипеда повышает профессиональный уровень программиста.

aH6y
Ты проверял? Кинь отчет по скорости =)

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).

inpost
Ну да проверил. Примерно в 20 раз быстрее вариант twin’a

_____________
Процесс написания своего велосипеда повышает профессиональный уровень программиста.

aH6y
так и дождёшься от «таких» людей отчета, прийдется идти самому проверять!

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).

inpost
Я тебе ничего не должен.

_____________
Процесс написания своего велосипеда повышает профессиональный уровень программиста.

aH6y
это понятно, тебя что-то переклинило в мою сторону, и ты без повода какой-то дикий, бросаешься на меня. А вот по нормальному попросил показать код проверки, нет, снова таки своё «я». Твоё дело, сам проверю. А в чужие тараканы лезть не буду, захочешь, сам напишешь в ЛС, какие у тебя ко мне проблемы.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).

Гы. Вот теперь он точно нам друг.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться — его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image

function mbWordwrap($str, $width = 44, $break = ' ', $cut = true)  
return preg_replace('#([\S].$width.'>'. ($cut ? '' : '\s') .')#u', '$1'. $break , $str);
>

_____________
Процесс написания своего велосипеда повышает профессиональный уровень программиста.

return preg_replace('#([\S].$width.'>'. ($cut ? '' : '\s') .')#u', '$1'. $break , $str);
$string = "тут слова какие-то";
$string1 = str_split($string, 4);
foreach($string1 as $key)

echo "$key I
"
;
>

Источник

Читайте также:  Загрузка файла
Оцените статью