Как распарсить строку php

Как распарсить строку php

Работа со строками в 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 разбивает строку на массив подстрок, используя указанный разделитель. Сигнатура: 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

Рекомендации:

  1. Используйте круглые скобки для выделения подстрок, которые нужно извлечь.
  2. Проверяйте результат вызова preg_match до обращения к массиву $matches, чтобы избежать предупреждений.
  3. Экраньте спецсимволы внутри шаблона, например, точку \. или слэш \/.
  4. Для поиска нескольких совпадений используйте 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

Функция 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

Как извлечь подстроку с помощью 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 строками через 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 данных

Функция 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).

Вопрос-ответ:

Ссылка на основную публикацию