Avatar ·

Как проверить, начинается ли строка с заданной подстроки в PHP?

Всем привет! Я новичок в PHP и столкнулся с такой задачей: нужно проверить, начинается ли строка с определённого слова или символа. Например, у меня есть переменная с названием файла: ```php $filename = "report_2023.pdf"; ``` Мне нужно узнать, начинается ли эта строка с "report_". В JavaScript я бы использовал `startsWith()`, но в PHP такого метода нет. Пробовал через `strpos`: ```php if (strpos($filename, "report_") !== false) { echo "Начинается с report_"; } ``` Но это проверяет, есть ли подстрока вообще в строке, а не только в начале. Если файл называется "my_report_2023.pdf", то условие тоже сработает, а мне нужно строго с начала. Пробовал ещё `substr`: ```php if (substr($filename, 0, 7) === "report_") { echo "Начинается с report_"; } ``` Это работает, но выглядит коряво и нужно вручную считать длину подстроки. Может, есть более элегантный способ? Подскажите, как правильно проверить начало строки в PHP, и какой способ считается лучшей практикой? Желательно с примерами кода. <<>>

Использование str_starts_with() (PHP 8.0+)

Начиная с PHP 8.0, появилась встроенная функция str_starts_with(), которая идеально подходит для этой задачи. Она принимает два аргумента: исходную строку и подстроку для проверки. Возвращает true, если строка начинается с заданной подстроки, и false в противном случае.

<?php
$filename = "report_2023.pdf";

if (str_starts_with($filename, "report_")) {
    echo "Файл начинается с 'report_'";
} else {
    echo "Файл не начинается с 'report_'";
}
// Вывод: Файл начинается с 'report_'
?>

Функция чувствительна к регистру. Если вам нужно проверять без учёта регистра, используйте str_starts_with(strtolower($string), strtolower($prefix)).

Решение для старых версий PHP (7.x и ниже) — substr()

Если вы работаете с PHP 7 или более ранней версией, используйте substr() для сравнения первых N символов:

<?php
$filename = "report_2023.pdf";
$prefix = "report_";

if (substr($filename, 0, strlen($prefix)) === $prefix) {
    echo "Файл начинается с 'report_'";
}
?>

Объяснение:

  • substr($filename, 0, strlen($prefix)) — извлекает из строки $filename первые символы, количество которых равно длине искомого префикса.
  • Оператор === проверяет строгое равенство (тип и значение).

Альтернатива: strncmp() (для бинарно-безопасного сравнения)

Функция strncmp() сравнивает первые N символов двух строк. Она также чувствительна к регистру и работает быстрее substr(), так как не создаёт новую строку, а сравнивает напрямую:

<?php
$filename = "report_2023.pdf";
$prefix = "report_";

if (strncmp($filename, $prefix, strlen($prefix)) === 0) {
    echo "Файл начинается с 'report_'";
}
?>

Важно: strncmp() возвращает 0, если строки равны (первые N символов). Возвращает отрицательное или положительное число при неравенстве.

Для проверки без учёта регистра

Используйте strncasecmp() — аналог strncmp(), но без учёта регистра:

<?php
$filename = "Report_2023.pdf";
$prefix = "report_";

if (strncasecmp($filename, $prefix, strlen($prefix)) === 0) {
    echo "Начинается с 'report_' (без учёта регистра)";
}
?>

Рекомендации по выбору

  • PHP 8.0+: используйте str_starts_with() — это самый читаемый и современный способ.
  • PHP 7.x: используйте strncmp() — он быстрее и не создаёт лишних строк.
  • Избегайте strpos() === 0 — это работает, но может ввести в заблуждение (проверяет позицию, а не начало).
<<>>

Использование регулярных выражений (для сложных шаблонов)

Если нужно проверить не просто статический префикс, а шаблон (например, "строка начинается с буквы и цифры"), используйте preg_match():

<?php
$filename = "report_2023.pdf";

if (preg_match('/^report_/', $filename)) {
    echo "Начинается с 'report_'";
}
?>

Объяснение: символ ^ в регулярном выражении означает "начало строки". Это самый гибкий метод, но он избыточен для простой проверки статического префикса, так как регулярные выражения работают медленнее.

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

Если нужно проверить множество строк на один префикс, оберните логику в функцию:

<?php
function startsWith($string, $prefix) {
    return strncmp($string, $prefix, strlen($prefix)) === 0;
}

$files = ["report_1.pdf", "report_2.pdf", "invoice_1.pdf"];
foreach ($files as $file) {
    if (startsWith($file, "report_")) {
        echo "$file — это отчёт\n";
    }
}
?>

Этот подход улучшает читаемость кода и позволяет легко менять логику проверки в одном месте.