Как в регулярном выражении обозначить конец строки?

«Как в регулярном выражении обозначить конец строки?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В PHP для обозначения конца строки в регулярных выражениях используется якорь $.

Базовое использование: Якорь $ соответствует позиции перед символом перевода строки (n) или концу строки, если его нет.

// Проверяем, что строка заканчивается расширением .php
$filename = 'index.php';
if (preg_match('/.php$/', $filename)) {
    echo 'Файл PHP';
}

// Проверяем, что строка состоит только из цифр от начала (^) до конца ($)
$input = '12345';
if (preg_match('/^d+$/', $input)) {
    echo 'Строка содержит только цифры';
}

Многострочный режим (модификатор m): С модификатором m якорь $ соответствует концу каждой строки в тексте, а не только концу всего текста.

$text = "Строка 1nСтрока 2nСтрока 3";
// Найдем все строки, заканчивающиеся на цифру
preg_match_all('/d$/m', $text, $matches); // Найдет '1', '2', '3'

Режим D (PCRE_DOLLAR_ENDONLY): Если модификатор D установлен, $ соответствует только абсолютному концу строки, игнорируя символ n. Это полезно, когда нужно строгое совпадение с концом данных.

$text = "testn";
var_dump(preg_match('/test$/D', $text)); // 0 (не совпадает, потому что после 'test' идет n)
var_dump(preg_match('/test$/m', $text)); // 1 (совпадает, т.к. $ считает позицию перед n)

Учет завершающих пробелов: Часто в пользовательском вводе бывают лишние пробелы. Чтобы их игнорировать при проверке конца строки, можно использовать s*$.

$userInput = 'my_value   ';
if (preg_match('/^my_values*$/', $userInput)) {
    echo 'Значение корректно (пробелы в конце не мешают)';
}