Как в PHP количество символов подсчитать и определить свой талант
От автора: краткость – сестра таланта, «засевшего» в Twitter! Сегодня я попытаюсь создать программный «тренажер», который позволит выработать у пользователей привычку изъясняться кратко. Для этого нужно научиться подсчитывать с помощью PHP количество символов.
Набираем форму
Сначала нам нужно набрать «форму». Так сказать, привести в тонус свои мозговые мышцы. Для этого потренируемся в верстке веб-формы для тренажера:
< h1 >Тренажер таланта < / h1 >
< p > < b >Введите текстовое сообщение длинной не более 140 символов : < / b > < / p >
Так форма для счета знаков в строке выглядит в браузере:
Обрабатываем
Теперь переходим к написанию обработчика для формы. Вот его первый вариант:
$comment = htmlspecialchars ( $_POST [ ‘comment’ ] ) ;
if ( strlen ( $comment ) < 140 )
echo $comment . "
» ;
echo «Количество знаков — » . strlen ( $comment ) . «
» ;
echo «Вы талант. » ;
echo $comment . «
» ;
echo «Количество знаков — » . strlen ( $comment ) . «
» ;
echo «Ваш талант нужно подтянуть!» ;

Чтобы определить длину текста, мы использовали функцию strlen(). В качестве параметров она принимает строку и возвращает число знаков в ней.
Хотя эта функция обладает одним серьезным недостатком: она считает не количество символов, а байт. Но в каждой из текстовых кодировок символ может занимать разное число байт. Например, в Unicode это может быть и два, и четыре.
Нивелируем проблему кодировки
Чтобы «нивелировать» эту проблему, применим другую функцию – iconv_strlen(). В отличие от предыдущей эта позволяет посчитать число знаков с учетом используемой кодировки. В следующем примере демонстрируется разница количества символов в одной и той же строке, но в разных кодировках:
$stroka = «Краткость — сестра Twitter» ;
echo $stroka . «
» ;
echo «Длина строки в UTF-8: » . iconv_strlen ( $stroka ) . «
» ;
echo iconv ( «KOI8-U» , «UTF-8» , $stroka ) . «
» ;
echo «Длина строки в KOI8-U: » . iconv_strlen ( iconv ( «KOI8-U» , «UTF-8» , $stroka ) ) ;

Обратите внимание, какая разница результата работы функции при передаче ей в качестве параметра одно и того же текста.
Второй вариант
Валидация форм – одно из самых больных мест любого веб-разработчика. Например, в регистрационных формах нужно обеспечить правильный синтаксис вводимых данных (электронной почты, пароля, логина).
Кроме этого валиадация может быть востребована в формах комментирования, отзывов. Особенно это касается длины текста. Часто разработчикам требуется ограничить данный показатель до определенного значения. И не выводить комментарий, если он длиннее «дозволенного».
Подобное решение можно реализовать на основе первого примера:
Урок 3: доступ к символу в строке, операторы PHP, конкатенация строк в PHP
Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!
Добрый день, уважаемые читатели блога Site on! Это четвёртая по счёту статья и если вы до неё добрались, значит вы действительно настроены на обучение и желаете узнать всю подноготную работы с PHP. Этим мы сегодня с вами и продолжим заниматься, а именно мы научимся: как работать с конкретным символом внутри строки, рассмотрим операторы в PHP и продолжим знакомство с конкатенацией. Также вам будет предложено решить задачу, которая поможет подытожить полученные знания.
Доступ к символу в строке
На дворе весна, а потому нашим подопытным кроликом станет следующая строчка:
Сразу скажу, что я не просто так написал фразу на английском. С русскими символами в строке всё всегда немного сложнее, а так как мы только начали своё обучение, отвлекаться на лишние нюансы не стоит, только запутаетесь. Продолжим. В PHP порядковый счёт начинается с нуля, а значит, первый символ в строке (буква «S») будет под порядковым номером ноль. Чтобы её достать достаточно написать следующее:
$myString = 'Spring has come!';
echo $myString; ?>

То есть, чтобы получить букву «i» нам нужно взять 4 символ из строки, но учитывая, что счёт начинается с нуля, то третий:
Бывают нередкие случаи, когда мы не знаем, сколько символов ожидать в строке, но точно знаем, что нам нужно взять, например, последний. В таком случае мы воспользуемся встроенной функцией PHP (их очень много) под названием strlen(), которая возвращает длину строки. Но этого нам будем мало, так как функция всего лишь вернёт нам число – количество символов в строке, а в PHP, как вы уже знаете, порядковый счёт начинается именно с нуля, поэтому логичным шагом будет вычесть от общего количества символов в строке единицу, чтобы получить порядковый номер последнего символа.
$myString = 'Spring has come!';
$last = strlen($myString)-1; // 16-1=15 echo $myString; ?>
Результат пора уже самим проверять 😉
То же самое в PHP можно записывать и в одну строчку:
; // одной строкой ?>
Операторы в PHP
Арифметические операторы
С большинством операторов все мы знакомы ещё со школы – это знаки деления, вычитания, умножения и сложения. В PHP они называются арифметическими операторами.
// Сумма $a и $b $a - $b // Разность $a и $b $a * $b // Произведение $a и $b $a / $b // Частное от деления $a на $b $a % $b // Целочисленный остаток от деления $a на $b // 5/2 равно 2.5, но 5%2 равно 1 $a += $b // Тоже, что и $a = $a + $b. Остальные операторы работают аналогично. ?>
Так как PHP не строго типизированный язык, то в нём есть возможность складывать слова и числа и на выходе всегда получать число. Тоже самое и с булевым типом, если мы попробуем прибавить к TRUE число 5, то в итоге получим 6, так как TRUE (мы уже с вами говорили) приравнивается к единице. Давайте рассмотрим остальные возможные случаи арифметических действий, где одно из выражений не число вовсе:
// 1 $b = $a * 10; // 10
$a = false; // 0 $c = $a * 10; // 0
$a = '5'; // 5 $d = $a * 10; // 50
$a = 'Hello'; // 0 $f = $a * 10; // 0
$a = '5Hello';// 5 $g = $a * 10; // 50
$a = '52Hello'; // 52 $h = $a * 10; // 520
$a = '52He7ll8o'; // 52 $j = $a * 10; // 520 ?>
С первым всё ясно, раз FALSE значит либо пустая строка, либо в нашем случае ноль. Если написать число как строку, то есть в одинарных или двойных кавычках, то PHP всё равно посчитает его как число. Просто любая строка (без цифр) приравнивается к нулю. В последних трёх случаях в наших строках есть и буквы и цифры, в этом случае PHP оставит все цифры до первой встреченной буквы.
Операторы сравнения
Далее у нас идут операторы сравнения. Существуют два вида сравнения: мягкое (гибкое) и жёсткое. Различие в том, что при жёстком сравнении PHP не будет пытаться привести всё к одному типу, как в предыдущем примере, когда всё приводилось к числам. Пример:
// TRUE если $a равно $b. $a === $b // TRUE если $a равно $b и имеет тот же тип
'5' == 5 // TRUE '5' === 5 // FALSE ?>
При этом обращаю ваше внимание на то, что просто знак равенства (=) является оператором присвоения, а не сравнения! Поэтому чтобы сравнить мы должны использовать либо два, либо три знака равенства подряд, в зависимости от нужного нам типа сравнения. Для тех, кто ещё плохо ориентируется в приведении одного типа к другому будут полезны следующие две таблички:


Как видите, при жёстком сравнении TRUE только по главной диагонали.
Зачастую бывает, что нам нужно идти от обратного, то есть мы хотим получить TRUE, когда одно не равно другому. Для этого пишем так:
// TRUE если $a не равно $b. $a !== $b // TRUE если $a не равно $b ИЛИ в случае, если они разных типов.
'5' != 5 // FALSE '5' !== 5 // TRUE
'10' != 5 // TRUE '10' !== 5 // TRUE
10 != 5 // TRUE 10 !== 5 // TRUE ?>
Обратите, пожалуйста, ещё раз своё внимание, когда мы проверяем на неравенство, то пишем на 1 знак равно (=) меньше, его нам заменяет восклицательный знак вначале. Остальные четыре оператора сравнения нам хорошо известны из математики:
// TRUE если $a строго меньше $b. $a > $b // TRUE если $a строго больше $b. $a // TRUE если $a меньше или равно $b. $a >= $b // TRUE если $a больше или равно $b. ?>
Логические операторы
Следующими у нас по плану идут логические операторы:
// TRUE если и $a, и $b TRUE. $a && $b // Тоже самое, но имеет больший приоритет, то есть проверка выполнится сначала на это выражение.
$a or $b // TRUE если или $a, или $b TRUE. $a || $b // Тоже самое, но имеет больший приоритет, то есть проверка выполнится сначала на это выражение.
!$a // TRUE если $a не TRUE. ?>
1) and (15>0) // TRUE (2>1) and (15>20) // FALSE
(2>1) or (15>0) // TRUE (2>1) or (15>20) // TRUE
$a = 0; !$a // TRUE
unset($a); !$a // TRUE
$a = NULL; !$a // TRUE
$a = 2; !$a // FALSE
$a = 'Hello'; !$a // FALSE
$a = '2'; !$a // FALSE ?>
Операторы условия
И в заключении мы рассмотрим условный оператор if (если), который используется «везде и всюду». Результатом выполнения этого оператора является исполнение кода внутри условия, если условие TRUE или неисполнение кода, если условие вернуло FALSE. Как это выглядит:
if (2>1) < echo 'Это правда!'; >echo '
Остальная часть страницы, она вне условия'; ?>

То есть мы видим, что когда условие внутри круглых скобочек выдаёт TRUE, то выполняется код внутри фигурных скобочек. Ещё пример:
5) < echo 'Это правда!'; >echo '
Остальная часть страницы, она вне условия'; ?>

В данном случае 2 не больше 5, а значит условие неверно, то есть FALSE.
Кроме того, чтобы выполнять код по приходу TRUE, мы можем указать, что необходимо сделать, если придёт FALSE. В этом нам поможет конструкция под названием else (иначе):
if (2>0) < echo 'Да, это правда.'; > else < echo 'Нет, это ложь!'; >
echo '
Остальная часть страницы, она вне условия'; ?>

if (2>48)< echo 'Да, это правда.'; > else< echo 'Нет, это ложь!'; >
echo '
Остальная часть страницы, она вне условия'; ?>

Немного о синтаксисе.
Во-первых, вы можете ставить пробелы и переносы строк везде, где захотите, а можете вообще нигде не ставить (обычно я не ставлю пробелов).
Во-вторых, фигурные скобочки можно не указывать, если внутри них всего 1 строка, как в наших примерах выше. То же самое можно было записать так:
if (2>48) echo 'Да, это правда.'; else echo 'Нет, это ложь!';
echo '
Остальная часть страницы, она вне условия'; ?>
И даже в одну строчку:
if (2>48) echo 'Да, это правда.'; else echo 'Нет, это ложь!';
echo '
Остальная часть страницы, она вне условия'; ?>
Но если строчек больше чем одна, фигурные скобки обязательны!
В-третьих, сразу после else можно объявить новое условие if, это делается с помощью конструкции elseif (иначе, если…) так:
if (2>48) < echo 'Да, это правда.'; > elseif (5>0 and 10=='10') < echo 'Вот это правда!'; > else < echo 'Опять ложь. '; >
echo '
Остальная часть страницы, она вне условия'; ?>

Попробуйте сами поиграться, такие условия можно строить до бесконечности 🙂
Тернарный оператор
Перед тем, как дать вам первое домашнее задание, расскажу ещё один нюанс синтаксиса. Вот это:
if (2>48)< echo 'Да, это правда.'; > else< echo 'Нет, это ложь!'; >
echo '
Остальная часть страницы, она вне условия'; ?>
Можно было записать с помощью тернарного оператора:
echo (2>48) ? 'Да, это правда.' : 'Нет, это ложь!';
echo '
Остальная часть страницы, она вне условия'; ?>

Это то же самое, только короче – всё в одну строку. Лично я редко им пользуюсь, но иногда так действительно удобней.
Ну что, знаний у нас накопилось уже достаточно, пришло время сделать что-то собственными руками. Сразу говорю, блок-схему рисовать не буду, так как это слишком наглядно.
Если решение выражения (14+$b-86*2)/(100+$b), где $b= 20, -14, 16 (проверить со всеми тремя значениями) противоположно числу 2 и при этом числитель и знаменатель дроби не равны между собой и не равны $b, то выводим в браузер решение выражения. Иначе выводим в браузер четвёртый символ из строки с решением выражения при условии, что сумма 3 и 4 символов не равна пяти. Для решения задачи можно использовать ТОЛЬКО материалы текущей и предыдущих статей. Пользоваться дополнительными справочниками и литературой запрещено. Моё решение данной задачи смотрите в следующей статье, чтобы не пропустить, можете подписаться на обновления (подписка в правой колонке или в самом верху ;)). Удачи!
Конкатенация строк в PHP
Конкатенация — это склеивание нескольких строк в одну. При конкатенации используется так называемый строковый оператор, он обозначается обыкновенной точкой (.),пробелы перед и после точки можете ставить, а можете не ставить, как вам удобней. Было у нас несколько строк, хотим положить одну к другой, используем конкатенацию. Посмотрим как это работает:
// $b содержит строку Hello World!
$a = "Hello "; $a .= "World!"; // $a содержит строку Hello World!
$a = "Hello"; $b = "World!"; print $a . " " . $b; // Hello World! ?>
Во что заключать строки при конкатенации (в двойные или одинарные кавычки) не имеет значения. В предыдущей статье о типах переменных в PHP я писал, что всегда стараюсь использовать одинарные кавычки, гораздо реже двойные.
Всем спасибо за внимание, на сегодня всё. Если что-то не очень понятно, не обессудьте, пишу всё на общественных началах 🙂 Оставляйте ваши замечания в комментариях, буду прислушиваться и делать выводы. Желаю удачи и до встречи на страницах Site on!
String
Execute and test PHP functions for string manipulation.
addslashes
Возвращает строку, в которой перед каждым спецсимволом добавлен обратный слэш, например, для последующего использования этой строки в запросе к базе данных и т.п. Экранируются одиночная кавычка (‘), двойная кавычка («), обратный слэш (\) и NUL (байт NULL).
bin2hex
Возвращает ASCII-строку, содержащую шестнадцатиричное представление аргумента $str. Преобразование производится побайтно, начиная с верхнего полубайта.
chr
Возвращает строку из одного символа, код которого задан аргументом $ascii.
chunk_split
Функция используется для разбиения строки на фрагменты, например, для приведения результата функции base64_encode() в соответствие с требованиями RFC 2045. Она вставляет строку $end после каждых $chunklen символов.
count_chars
Подсчитывает количество вхождений каждого из символов с ASII-кодами в диапазоне (0..255) в строке $string и возвращает эту информацию в различных форматах.
explode
Возвращает массив строк, полученных разбиением строки $string с использованием $delimiter в качестве разделителя.
html_entity_decode
html_entity_decode() является противоположностью функции htmlentities(). Она преобразует все HTML-сущности в строке $string в соответствующие символы.
htmlentities
Эта функция идентична htmlspecialchars() за исключением того, что htmlentities() преобразует все символы в соответствющие HTML-сущности (для тех символов, для которых HTML сущности существуют).
htmlspecialchars
В HTML некоторые символы имеют специальное значение и для сохранения своего значения должны быть преобразованы в HTML-сущности. Эта функция возвращает строку, над которой проведены эти преобразования. Если вам нужно преобразовать все возможные сущности, используйте htmlentities().
Вызова функции htmlspecialchars() достаточно, если кодировка поддерживает все символы во входной строке (такая как UTF-8, но также ISO-8859-1 при входной только ISO-8859-1). Необходимость в вызове функции htmlentities() появляется только тогда, когда выходная кодировка не поддерживает все символы из входной строки.
implode
Объединяет элементы массива с помощью строки $glue.
levenshtein
Расстояние Левенштейна — это минимальное количество вставок, замен и удалений символов, необходимое для преобразования $str1 в $str2. Сложность алгоритма равна O(m*n), где n и m — длины строк $str1 и $str2 (неплохо по сравнению с similar_text(), имеющей сложность O(max(n,m)**3), но все же довольно много).
В простейшей форме функция принимает в качестве аргументов две строки и возвращает минимальное количество вставок, замен и удалений символов, необходимое для преобразования $str1 в $str2.
number_format
Функция принимает один, два или четыре аргумента (не три):
Если передан только один аргумент, $number будет отформатирован без дробной части, но с запятой («,») между каждыми тремя цифрами.
Если переданы два аргумента, $number будет отформатирован с $decimals знаками после точки («.») и с запятой («,») между каждыми тремя цифрами.
Если переданы все четыре аргумента, $number будет отформатирован с $decimals знаками после точки и с разделителем между между каждыми тремя цифрами, при этом в качестве десятичной точки будет использован $dec_point, а в качестве разделителя групп — $thousands_sep.
ord
Возвращает ASCII-код первого символа строки $string. Эта функция дополняет функцию chr().
parse_str
Разбирает строку $str, которая должна иметь формат строки запроса URL и присваивает значения переменным в текущем контексте.
similar_text
Вычисляет степень похожести двух строк по алгоритму, описанному Oliver [1993]. Эта реализация алгоритма не использует стека, использованного в оригинале, вместо этого применяются рекурсивные вызовы, что в некоторых случаях может ускорить процесс. Сложность алгоритма составляет O(N**3), где N — длина более длинной из двух строк.
soundex
Возвращает ключ soundex для строки $str.
Двум словам, имеющим схожее произношение, соответствует один и тот же ключ soundex. Это свойство может быть использовано, например, при поиске по базе даных, когда известно произношение слова и неизвестно его написание. Данная функция возвращает строку из 4 символов, начинающуюся с буквы.
Данная реализация функции soundex описана Дональдом Кнутом (Donald Knuth) в книге «The Art Of Computer Programming, vol. 3: Sorting And Searching», Addison-Wesley (1973), стр. 391-392.
str_pad
Эта функция возвращает строку $input, дополненную слева, справа или с обоих сторон до заданной длины. Если необязательный аргумент $pad_string не передан, то $input будет дополнен пробелами, иначе он будет дополнен символами из $pad_string до нужной длины.
str_replace
Эта функция возвращает строку или массив, в котором все вхождения $search в $subject заменены на $replace.
Если не нужны сложные правила поиска/замены (например, регулярные выражения), использование этой функции предпочтительнее preg_replace().
str_rot13
Выполняет над строкой $str преобразование ROT13 и возвращает полученную строку.
Преобразование ROT13 заключается в простом сдвиге каждой латинской буквы на 13 позиций в алфавите, остальные символы не изменяются. Обратное преобразование выполняется той же функцией, так как передача закодированной строки в качестве аргумента вернет ее оригинальную версию.
strip_tags
Эта функция пытается возвратить строку $str, из которой удалены все NUL-байты, HTML и PHP теги. Для удаления тегов используется тот же автомат, что и в функции fgetss().
stripos
Ищет позицию первого вхождения подстроки $needle в строку $haystack.
stristr
Возвращает всю строку $haystack начиная с первого вхождения $needle включительно.
strlen
Возвращает длину строки $string.
strncmp
Эта функция подобна strcmp(), за исключением того, что можно указать максимальное количество символов в обоих строках, которые будут участвовать в сравнении.
Эта функция учитывает регистр символов.
strpos
Ищет позицию первого вхождения подстроки $needle в строку $haystack.
strripos
Ищет позицию последнего вхождения подстроки $needle в строку $haystack.
strrpos
Ищет позицию последнего вхождения подстроки $needle в строку $haystack.
strstr
Возвращает подстроку строки $haystack начиная с первого вхождения $needle (и включая его) и до конца строки $haystack.
strtolower
Возвращает строку $string, в которой все буквенные символы переведены в нижний регистр.
Принадлежность того или иного символа к буквенным определяется с учетом текущей локали. Это означает, что, например, в используемой по умолчанию локали «C», символ ? не будет преобразован.
strtoupper
Возвращает строку $string, в которой все буквенные символы переведены в верхний регистр.
Принадлежность того или иного символа к буквенным определяется с учетом текущей локали. Это означает, что, например, в используемой по умолчанию локали «C», символ ? не будет преобразован.
strtr
Если указаны три аргумента, эта функция возвращает копию $str, в которой все вхождения каждого символа (однобайтного) из $from были заменены на соответствующий символ в параметре $to, т.е. каждое вхождение из $from[$n] заменяется на $to[$n], где $n это корректное смещение строки в обоих аргументах.
Если длины строк $from и $to отличаются, «лишние» символы в более длинной строке не используются. Длина возвращаемого значения будет такой же, как и длина $str.
substr
Возвращает подстроку строки $string, начинающейся с $start символа по счету и длиной $length символов.
substr_count
substr_count() возвращает число вхождений подстроки $needle в строку $haystack. Заметьте, что параметр $needle чувствителен к регистру.
Syllable Division
This script, devide string into their syllables. You will recieve an array with all syllables divided. This script is written and tested for german words.
The code was started by PHP-Blogger and was modified in details by myself. There are still some bugs.
trim
Эта функция возвращает строку $str с удаленными из начала и конца строки пробелами. Если второй параметр не передан, trim() удаляет следующие символы:
- » » (ASCII 32 (0x20)), обычный пробел.
- «\t» (ASCII 9 (0x09)), символ табуляции.
- «\n» (ASCII 10 (0x0A)), символ перевода строки.
- «\r» (ASCII 13 (0x0D)), символ возврата каретки.
- «\0» (ASCII 0 (0x00)), NUL-байт.
- «\x0B» (ASCII 11 (0x0B)), вертикальная табуляция.
ucfirst
Возвращает строку $str, в которой первый символ переведен в верхний регистр, если этот символ является буквой.
Принадлежность того или иного символа к буквенным определяется с учетом текущей локали. Это означает, что, например, в используемой по умолчанию локали «C», символ ä не будет преобразован.
ucwords
Возвращает строку $str, в которой первый символ каждого слова переведен в верхний регистр, если этот символ является буквой.
Эта функция считает словами последовательности символов, разделенных пробельными символами, которыми являются пробел, разрыв страницы, перевод строки, возврат каретки, горизонтальная и вертикальная табуляция.
vsprintf
Эта функция подобна sprintf(), но она принимает не переменное число аргументов, а массив.
wordwrap
Переносит строку по указанному количеству символов.
PHP. Посчитать сколько раз слово, строка или значение встречается в тексте
Данный материал предоставлен сайтом PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.

Если возникла необходимость посчитать, сколько раз в тексте может встретится строка, слово, значение, буква или сочетание букв, то можно воспользоваться встроенной в язык PHP функцией mb_substr_count.
Функция mb_substr_count возвращает количество вхождений подстроки.
Пример поиска сочетания букв `ст` в виде строки в произвольном тексте, присвоенный переменной $text:
$text = "Давайте посчитаем сколько раз в данном тексте встретится сочетание букв `ст`"; // Текст в котором будет осуществлен поиск $find = "ст"; // Строка у которой необходимо подсчитать количество вхождений в тексте echo mb_substr_count($text, $find); // Функция подсчета

В данном рецепте используется функция mb_substr_count, так как в отличии от функции substr_count, mb_substr_count умеет работать с кодировками.
Требуемая кодировка указывается третьим параметром в функции mb_substr_count.
Если указанная кодировка отсутствует, то о умолчанию будет использоваться значение внутренней кодировки.
