четверг, 21 июня 2012 г.

Считаем количество символов в строке. PHP

В данной статье я рассмотрю подсчет символов в строке. В обычном случае может применяться стандартная функция strlen(). Но если у вас кириллица, то есть используется кодировка UTF-8, данные функции будут работать не так, как бы нам хотелось.
Приведем небольшой пример:

if (isset($_POST['fio']) && strlen($_POST['fio']') <= 8){ 
echo "Слишком мало информации в поле 'Фамилия, имя, отчество'!";
    }
В данном примере мы проверяем данные, отправленные с текстового поля с name = 'fio' и если длина строки не превышает 8 символов, надеемся увидеть сообщение о том, что пользователь ввел мало информации и, естественно, не обрабатывать данные дальше.

Если пользователь вводит латиницу или спец. симаолы, то данный пример работает отлично.
Однако, если пользователь, например, будет работать с кириллицей (что нам и нужно),  то при вводе даже 5 символов данное условие не сработает.

Посмотрим, что же тут не так. Введём, например, в тестовое поле слово 'тест' и обработаем следующим образом:

if (isset($_POST['fio'])){ 
echo "Количество введённых символов: " . strlen($_POST['fio']');
    }

Получаем: Количество введённых символов: 8  


Причина такого расхождения в ожидаемой и реальной длине — размер кириллических символов в UTF-8: по 2 байта вместо 1 для латинских. Функция strlen() считает длину строки в байтах, а не в буквах, и если буква занимает два байта, она засчитывается за две.

Что же делать?!!
Решение первое. Используем функцию  iconv_strlen(), которая возвращает число символов в строке.

Синтаксис функции: 
           int iconv_strlen (string str [, string charset])

В отличие от strlen(), iconv_strlen() подсчитывает число символов на основании кодировки, переданной во втором не обязательном параметре, а не как простой подсчёт байтов в строке.

Помните, что:
 длина строки не обязательно будет соответствовать количеству байт в ней,   так как в различных кодировках различные символы кодируются различным количеством байт, например, юникод может быть и двух-, и четырёхбайтным.

Необязательный параметр charset указывает кодировку, в которой следует интерпретировать строки. Если он опущен, по умолчанию, будет использоваться кодировка, определённая в iconv.internal_charset.

Теперь, если мы перепишем наш последний пример следующим образом, то получим:

if (isset($_POST['fio'])){ 
echo "Количество введённых символов: " . iconv_strlen($_POST['fio']', 'UTF-8');
    }

Ввод пользователя: 'тест'.

Получаем: Количество введённых символов: 4 

Решение второе.  Используем функцию mb_strlen().

Синтаксис функции: 

         int mb_strlen (string $str [, string $encoding ])


mb_strlen() возвращает количество символов в строке str, имеющих кодировку символов encoding. Многобайтный символ вычисляется как 1.
encoding - это кодировка символов для str. Если encoding опущен, используется внутренняя кодировка.

Проверим работу этой функции на нашем примере:

if (isset($_POST['fio'])){ 
echo "Количество введённых символов: " . mb_strlen($_POST['fio']', 'UTF-8');
    }

Ввод пользователя: 'тест'.
Получаем: Количество введённых символов: 4 


Ссылки по теме:

http://php.net/manual/ru/function.mb-strlen.php
http://php.su/functions/?mb-strlen

http://php.su/functions/?strlen
http://www.php.net/manual/ru/function.strlen.php

http://php.su/functions/?count
http://www.php.net/manual/ru/function.count.php

http://hu2.php.net/manual/ru/function.iconv-strlen.php

Комментариев нет:

Отправить комментарий