ProfiPHPProfiPHP
  1. Главная
  2. Самоучитель PHP 7
  3. Строковые функции

Строковые функции

Для Web разработки наиболее главным инструментом являются строки и функции их обработки.

Строки как массивы


В языке программирования РНР строки рассматриваются как массивы, элементами которых выступают символы. Первый элемент помечается индексом 0, второй - 1 и т. д.
<?php
$str = 'PHP';
echo $str[0]; // P
echo $str[1]; // H
echo $str[2]; // P
Результатом работы скрипта будет строка "РНР".

UTF-8. Расширение mbstring


Сегодня кодировка UTF-8 является базовой для приложений. Переход на UTF-8 не только дает возможность использовать в одном документе тексты на разных языках, но и позволяет расширить кодировку при появлении новых символов. В РНР 7 символы из кодировки UTF-8 могут быть заданы при помощи специального синтаксиса, в строках указывается последовательность \u, после которой следует шестнадцатеричный код символа в фигурных скобках:
<?php
echo "\u{0410}"; // A
В UTF-8 английские символы занимают один байт, а русские - два. Если обратиться к UTF-8 строке, как к массиву символов, используя квадратные скобки, в случае английского языка будет получен символ, а в случае русского - только половина символа:
<?php
$str = "Hello world";
echo "{$str[0]}<br />"; // H
$str = "Привет мир!"; // �
echo "{$str[0]}<br />";
Для решения проблемы, как правило, подключают расширение Mbstring, поддерживающее работу с многобайтными кодировками либо используют функции Mbstring напрямую, либо настраивают РНР таким образом, чтобы стандартные строковые функции РНР заменялись mbstring-aнaлoгaми. Как подключить библиотек Mbstring можно узнать из статьи: Модуль Mbstring для работы с многобайтными строками.

Функции для работы с символами


Чтобы узнать длину строки существует функция Strlen, которая принимает в качестве единственного аргумента строку. Данная функция часто используется совместно с другими функциями, а также при работе с посимвольным представлением строки. В следующем примере в цикле For выводится строка $str, содержащая слово "Hello". Скрипт основан на том факте, что элемент $str[0] содержит первый символ строки, $str[1] – второй и т. д. до конца строки:
<?php
$str = 'Hello';
for($i = 0; $i < strlen($str); $i++) {
echo $str[$i];
}
Функция Chr принимает в качестве аргумента ASCII-кoд символа и возвращает соответствующий этому коду фактический символ. Приведем пример использования функции для получения символа с кодом 45:
<?php
echo chr(45); // -
Функция Ord выполняет действие, обратное функции Chr - возвращает ASCII-кoд символа, переданного ей в качестве аргумента:
<?php
echo ord('-'); // 45
Если параметр $str функции Ord содержит более одного символа, ASCII-кoд будет возвращен только для первого.

Поиск в строке


Функция Substr возвращает часть строки (подстроку). В качестве аргументов функции передается исходная строка, из которой вырезается текст, номер символа, с которого осуществляется начало подстроки и длина возвращаемой подстроки в символах. Если длина не указана, то возвращается вся оставшаяся часть строки.
<?php
$str = 'Hello, World!';
echo substr($str, 0, 5); // Hello
echo substr($str, 6); // World!
Функция Strpos возвращает позицию вхождения подстроки в строку. В качестве первого аргумента функции передается строка, в которой осуществляется поиск, вторым аргументом указывается символ поиска. Также третий необязательный параметр позволяет задать позицию, начиная с которого будет осуществляться поиск. Если строка не найдена, возвращается False.
<?php
echo strpos('Hello, world!', ','); // 5

Замена в тексте


Функции замены осуществляют преобразования строк, связанные с заменой одних подстрок другими, а также удалением подстрок. Наиболее часто используемой функцией является Str_replace, которая позволяет заменить подстроку в тексте другой подстрокой. В качестве аргументов функции выступают искомое значение, значение замены и строка, в которой заменяются все вхождения. Одной из распространенных задач является замена тегов форматирования в стиле bbCode их НТМL-эквивалентами:
<?php
$str = '[і]Текст[/і] курсивом';
$str = str_replace('[і]', '<і>', $str);
$str = str_replace('[/і]', '</і>', $str);
echo $str; // Текст курсивом
Результатом работы примера будет замена всех символов и на <i> и </i> соответственно.

Помимо подстрок, функция Str_replace вместо параметров поиска и замены может принимать массивы с равным количеством элементов. Элемент массива поиска заменяется соответствующим элементом массива замены. Если необходимо выяснить, сколько замен было осуществлено в строке, в данной функции можно указать необязательный последний четвертый параметр, в который после завершения работы функции будет помещено количество осуществленных замен.

Функция Trim удаляет ведущие и конечные пробельные символы из начала и конца строки и принимает в качестве аргумента строку. Зачастую данных символов бывает недостаточно, в этом случае во втором необязательном параметре приводится список символов, которые необходимо считать пробельными.

Работа с НТМL-кодом


Поскольку сначала РНР разрабатывался как язык для Web-проектирования, среди строковых функций имеется несколько специально предназначенных для обработки языка разметки HTML.

Для вывода данных с новой строки применяется специальный НТМL-тег <br />, поскольку браузеры интерпретируют переводы строк \n как обычный пробельный символ. Для решения задачи замены обычных переводов строк в НТМL-эквивалент РНР предоставляет специальную функцию Nl2br.

Особенность функции Nl2br в том, что тег <br /> вставляется рядом с символом перевода строки, а не заменяет его собой. Такое поведение функции может быть не удобным, если текст предназначен для подстановки в JavaScript-cкpипт. В этом случае удобнее воспользоваться функцией Str_replace.

Функция Htmlspecialchars позволяет преобразовать НТМL-код в безопасное представление. Применение этой функции гарантирует, что любой введенный пользователем код (РНР, JavaScript и т.д.) будет отображен, но выполняться не будет. Таким образом, функцию следует применять, если необходимо вывести в браузере какой-то код или обезопасить ввод пользователя.

Иногда удобнее вообще удалить НТМL-теги из текста. Для этого предназначена специальная функция Strip_tags, которая удаляет из строки все теги кроме тех, которые указываются во втором параметре функции.

Форматный вывод


Для форматного вывода предназначена функция Printf. В качестве аргументов функция принимает строку форматирования и переменные, определяемые строкой форматирования. Данная функция позволяет осуществлять вывод в удобной и нужной для вас формы, например, можно использовать для вывода определенного числа символов после запятой для денежных единиц, где обязательным требованием являются два знака после запятой.

Объединение и разбиение строк


Для разбивки строки по определенному разделителю предназначена функция Explode, которая возвращает массив строк, каждая из которых соответствует фрагменту исходной строки между разделителям. Можно задать максимальное количество элементов в результирующем массиве, и, соответственно, в последнем элементе будет храниться значения оставшейся части строки. Приведем пример использования функции:
<?php
$str = 'Red,Green,Yellow';
echo '<pre>';
print_r(explode(',', $str));
Результатом выполнения будет массив:
Array
(
[0] => Red
[1] => Green
[2] => Yellow
)
Функция Implode является обратной функции Explode и осуществляет объединение элементов массива в строку:
<?php
$str = ['Red,Green,Yellow'];
print_r(implode(',', $str)); // Red,Green,Yellow
Функция Explode возвращает строку, которая содержит элементы массива, между которыми вставляется значение, заданные в параметре функции.

Часто в HTML требуется ограничить количество символов на одной строке, то есть слишком длинное слово или предложение может нарушить дизайн страницы. Для этого предназначена функция Wordwrap, которая осуществляет перенос на заданное количество символов с использованием символа разрыва строки. Но использовать ее для кодировки UTF-8 не рекомендуется, поскольку возможен неправильный результат работы.

Сериализация объектов и массивов


Пара функций Serialize и Unserialize позволяют осуществлять упаковку и распаковку массивов и объектов.

В качестве аргумента функция Serialize принимает массив или объект, возвращая его в виде закодированной строки. Симметричная ей функция Unserialize принимает в качестве аргумента закодированную строку, возвращая массив или объект. Продемонстрируем пример использование обеих функций:
<?php
$array = [1, 2, 'a', 'b', 'c'];
// Упаковываем массив в строку
$str = serialize($array);
echo "$str<br />";
// Извлекаем массив из строки
$arr = unserialize($str);
echo '<pre>';
print_r($arr);
Результатом работы примера будут следующие строки:
a:5:{i:0;i:1;i:1;i:2;i:2;s:1:"a";i:3;s:1:"b";i:4;s:1:"c";}
Array
(
[0] => 1
[1] => 2
[2] => a
[3] => b
[4] => c
)

JSON-формат


Процедура сериализации имеет несколько недостатков. При попытке сериализовать уже сериализованные данные, восстановить строку при помощи функции Unserialize может не получиться. Поэтому для сохранения массива в строку чаще прибегают к формату JSON, который в последние годы приобрел большую популярность среди Web-разработчиков. Формат представляет собой объект JavaScript. Одним из достоинств данного формата является его легкое восприятие человеком. Формат позволяет задавать строковые, числовые значения, организовывать вложенные структуры, аналогичные ассоциативным массивам РНР.

В языке JavaScript, JSON может использоваться непосредственно, как объект языка. Благодаря этому формат интенсивно применяется для асинхронных АJАХ-запросов. В РНР доступны две функции для работы с JSON: Json_encode и Json_decode.

Функция Json_encode преобразует переменную, которая указана в параметре функции, в JSON-последовательность.
<?php
$arr = [
'color' => 'Желтый',
'num' => [
'123',
'456'
]
];
echo json_encode($arr);
Результат работы скрипта из приведенного выше примера:
{"color":"\u0416\u0435\u043b\u0442\u044b\u0439","num":["123","456"]}
По умолчанию функция Json_encode кодирует символы UTF-8 в последовательность \uXXXX. Для того чтобы предотвратить такое кодирование, потребуется настроить работу функции при помощи второго параметра, который может принимать предопределенные константы JSON. Нам потребуется константа JSON_UNESCAPED_UNICODE для того, чтобы предотвратить кодирование UTF-8, который и так прекрасно обрабатывается всеми остальными языками, включая JavaScript.
echo json_encode($arr, JSON_UNESCAPED_UNICODE); //{"color":"Желтый","num":["123","456"]}
Для преобразования JSON-строки в массив РНР предназначена функция Json_decode, которая принимает в качестве параметра JSON-строку и возвращает ассоциативный массив РНР, если значение второго параметра функции выставлено в True:
<?php
$str = '{"color":"Желтый","num":["123","456"]}';
print_r(json_decode($str, true));
Результат выполнения примера выглядит следующим образом:
Array
(
[color] => Желтый
[num] => Array
(
[0] => 123
[1] => 456
)

)
Если значение этого параметра выставлено в False или параметр не указан, возвращается объект.

Добавить комментарий

Имя:
Текст комментария: