Работа со строками в PHP требует чёткого понимания доступных инструментов. Если необходимо извлечь значения из строки, которая имеет определённую структуру, например, форматированную строку запроса или лог, стоит использовать функции explode(), preg_match() или str_getcsv() в зависимости от задачи.
Функция explode() применяется, когда строка разделена фиксированным разделителем. Например, при разборе строки «name=Иван;age=30;city=Москва» по точке с запятой можно получить массив ключ-значение, дополнительно используя parse_str() для декодирования структуры запроса.
Для извлечения данных по шаблону удобнее использовать регулярные выражения. preg_match() позволяет точно указать ожидаемую структуру строки и вытащить нужные элементы. Например, шаблон /name=(\w+);age=(\d+);city=([\w]+)/ применим для извлечения параметров из строки профиля пользователя.
Когда строка содержит данные в CSV-формате, стоит применять str_getcsv(). Она учитывает кавычки, экранирование и запятые как разделители, что важно для корректного разбора строк с вложенными значениями, особенно полученных из внешних источников.
Разбор строки – не просто извлечение подстрок, а точная операция, требующая понимания структуры входных данных. Выбор метода зависит от формата, регулярности и целей последующей обработки.
Использование функции explode для разделения строки по символу
Функция explode разбивает строку на массив подстрок, используя указанный разделитель. Сигнатура: explode(string $delimiter, string $string, int $limit = PHP_INT_MAX): array.
Пример: $parts = explode(«,», «яблоко,груша,слива»); создаст массив [«яблоко», «груша», «слива»]. Разделителем служит запятая.
Если указать параметр $limit, explode вернёт не более указанного количества элементов. Последний элемент будет содержать остаток строки. Пример: explode(«:», «час:минута:секунда», 2) вернёт [«час», «минута:секунда»].
При использовании пустого разделителя возникнет ошибка. Также, если разделитель не найден, вернётся массив с одним элементом – исходной строкой.
Функция чувствительна к регистру: explode(«a», «Java») вернёт [«J», «v», «»], а explode(«A», «Java») – [«Java»].
Для удаления пробелов до и после элементов рекомендуется использовать array_map(‘trim’, …): array_map(‘trim’, explode(«,», » a , b , c «)) даст [«a», «b», «c»].
Используйте explode при работе с CSV, логами, URL-параметрами и другими строками с чётко определённым разделителем.
Парсинг строки с регулярными выражениями через preg_match
Функция preg_match
в PHP позволяет извлекать данные из строки по шаблону, основанному на регулярных выражениях. Она возвращает 1
, если найдено совпадение, и заполняет массив совпадений, переданный по ссылке.
$pattern = '/(\d{4})-(\d{2})-(\d{2})/';
$string = 'Дата публикации: 2025-05-02';
if (preg_match($pattern, $string, $matches)) {
echo "Год: {$matches[1]}, Месяц: {$matches[2]}, День: {$matches[3]}";
}
- $pattern – шаблон с тремя группами: год, месяц, день.
- $string – целевая строка для анализа.
- $matches – массив, где:
$matches[0]
содержит полное совпадение –2025-05-02
$matches[1]
– год2025
$matches[2]
– месяц05
$matches[3]
– день02
Рекомендации:
- Используйте круглые скобки для выделения подстрок, которые нужно извлечь.
- Проверяйте результат вызова
preg_match
до обращения к массиву$matches
, чтобы избежать предупреждений. - Экраньте спецсимволы внутри шаблона, например, точку
\.
или слэш\/
. - Для поиска нескольких совпадений используйте
preg_match_all
, а неpreg_match
.
Пример: извлечение email из строки.
$pattern = '/([a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,})/i';
$string = 'Контакт: admin@example.com';
if (preg_match($pattern, $string, $matches)) {
echo $matches[1]; // admin@example.com
}
Регулярные выражения позволяют точно определить структуру данных, минимизируя ложные срабатывания.
Обработка строк с помощью функции sscanf
Функция sscanf
разбирает строку по заданному формату и извлекает значения напрямую в переменные. Это особенно полезно, когда данные имеют фиксированную структуру, например: «ID: 123; Name: Ivan; Age: 25».
Сигнатура: sscanf(string $string, string $format, mixed &...$vars): int|false
. Первый аргумент – исходная строка, второй – формат, остальные – переменные, куда попадут результаты разбора.
Пример:
$input = "Product: Book, Price: 250, Qty: 3";
sscanf($input, "Product: %s, Price: %d, Qty: %d", $product, $price, $qty);
После выполнения: $product = "Book"
, $price = 250
, $qty = 3
.
Подстановочные символы формата соответствуют типам: %d
– целое число, %f
– число с плавающей точкой, %s
– строка без пробелов. Для чтения строк с пробелами используйте ограничение: %[^,]
– до запятой, %[^\n]
– до конца строки.
Проверяйте возвращаемое значение sscanf
. Оно показывает количество успешно считанных значений. Несовпадение формата приводит к частичному или нулевому разбору:
if (sscanf($data, "%d:%s", $id, $name) !== 2) {
// ошибка разбора
}
sscanf
не работает с регулярными выражениями, но обрабатывает структурированные строки быстрее и безопаснее, чем preg_match
в простых случаях. Используйте её при жёстко заданном формате данных.
Как извлечь подстроку с помощью substr и strpos
Функция strpos
определяет позицию начала подстроки в строке. Она чувствительна к регистру и возвращает индекс первого вхождения искомой последовательности символов. Если подстрока не найдена, возвращается false
.
Функция substr
извлекает фрагмент строки, начиная с указанной позиции и на заданную длину. В сочетании с strpos
можно точно выделить нужную часть текста.
Пример: пусть дана строка $text = "email: user@example.com;"
. Требуется получить адрес электронной почты. Сначала ищем начало адреса:
$start = strpos($text, "user@");
Если позиция найдена, используем substr
для извлечения. Допустим, адрес всегда заканчивается символом ;
:
$end = strpos($text, ";", $start);
$email = substr($text, $start, $end - $start);
Результат: user@example.com
. Подобный подход позволяет точно управлять границами извлекаемой информации, избегая регулярных выражений.
Если начало подстроки неизвестно, можно использовать ключевые слова. Например, для выделения значения после "email:"
:
$start = strpos($text, "email:") + strlen("email:");
$end = strpos($text, ";", $start);
$email = trim(substr($text, $start, $end - $start));
trim
удаляет возможные пробелы. Такой способ удобен для парсинга данных с фиксированными маркерами начала и конца.
Работа с JSON строками через json_decode
Функция json_decode()
преобразует JSON-строку в переменную PHP. По умолчанию результатом будет объект stdClass, но передача второго аргумента true
вернёт ассоциативный массив.
Пример: json_decode('{"name":"Ivan","age":30}', true)
вернёт массив ['name' => 'Ivan', 'age' => 30]
. Без true
результат будет объектом: $data->name
, $data->age
.
При обработке JSON важно учитывать флаг JSON_THROW_ON_ERROR
, доступный с PHP 7.3. Он позволяет заменить молчаливую ошибку на исключение: json_decode($json, true, 512, JSON_THROW_ON_ERROR)
. Это предотвращает ситуацию, когда данные не распарсились, но код продолжает работу с null
.
Функция чувствительна к структуре JSON: лишняя запятая, неверные кавычки или неэкранированные символы вызывают ошибку. Проверка json_last_error()
и json_last_error_msg()
необходима, если не используется исключение. Пример: if (json_last_error() !== JSON_ERROR_NONE) { echo json_last_error_msg(); }
.
Часто JSON приходит с внешнего API. Проверяй наличие обязательных ключей после декодирования через isset()
или array_key_exists()
. Это исключает ошибки при доступе к несуществующим данным.
Для вложенных структур используй вложенные обращения: $data['user']['email']
. Но перед этим обязательно проверяй существование каждого уровня, чтобы избежать Undefined index
.
Использование str_getcsv для парсинга CSV данных
Функция str_getcsv
предоставляет нативный способ разбора строк, отформатированных в CSV. Она учитывает стандартные правила CSV: кавычки, экранирование, разделители полей.
Сигнатура функции: str_getcsv(string $input, string $delimiter = ",", string $enclosure = "\"", string $escape = "\\")
.
Пример разбора строки:
$строка = 'Иванов,"Иван, Петрович",35,"Москва, Россия"';
$данные = str_getcsv($строка);
// Результат: ['Иванов', 'Иван, Петрович', '35', 'Москва, Россия']
Функция корректно обрабатывает вложенные запятые внутри кавычек и экранированные кавычки внутри значений:
$строка = '"Фамилия","Имя","Возраст","Адрес"';
$заголовки = str_getcsv($строка);
$строка = '"Петров","Олег","28","ул. Ленина, д. 10, кв. 5"';
$значения = str_getcsv($строка);
Для обработки нескольких строк CSV используют сочетание explode
и str_getcsv
:
$csv = <<
Если требуется изменить разделитель (например, на точку с запятой), указывайте его явно:
$строка = '"Имя";"Возраст";"Город"';
$результат = str_getcsv($строка, ';');
Избегайте использования explode
вместо str_getcsv
при разборе CSV – explode
не обрабатывает кавычки и вложенные разделители, что приводит к ошибкам.
Как разделить строку на массив с использованием str_split
Функция str_split()
разбивает строку на массив подстрок фиксированной длины. Это полезно, если нужно получить массив символов или блоков заданного размера.
- Сигнатура:
str_split(string $string, int $length = 1): array
- Параметр
$length
: определяет размер блоков. По умолчанию – 1 (по одному символу).
Пример разделения строки на символы:
$input = "example";
$result = str_split($input);
// ['e', 'x', 'a', 'm', 'p', 'l', 'e']
Для деления на блоки по 3 символа:
$input = "123456789";
$result = str_split($input, 3);
// ['123', '456', '789']
Если длина строки не делится нацело на $length
, последний элемент будет короче:
$input = "abcdefg";
$result = str_split($input, 3);
// ['abc', 'def', 'g']
Функция не поддерживает многобайтовые строки (UTF-8). Для работы с Unicode используйте mb_str_split()
из расширения mbstring
:
$input = "Пример";
$result = mb_str_split($input);
// ['П', 'р', 'и', 'м', 'е', 'р']
- Для PHP до версии 7.4 используйте
preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY)
.