Str ends with: примеры (PHP)
str_ends_with(string haystack, string needle): boolФункция str_ends_with проверяет, заканчивается ли заданная строка указанной подстрокой. Она была добавлена в PHP 8.0. Основное применение - валидация суффиксов, проверка расширений файлов, анализ окончаний слов без необходимости написания собственных функций.
Синтаксис: str_ends_with(string $haystack, string $needle): bool
- $haystack (обязательный) - строка, в которой выполняется поиск.
- $needle (обязательный) - подстрока, наличие которой проверяется в конце строки $haystack.
Функция возвращает true, если $haystack заканчивается на $needle, и false в противном случае. Проверка чувствительна к регистру.
<?php
// Проверка расширения файла
$filename = 'document.pdf';
var_dump(str_ends_with($filename, '.pdf'));
// Проверка окончания строки
$url = 'https://example.com';
var_dump(str_ends_with($url, '.com'));
// Проверка с учетом регистра
$text = 'Hello World';
var_dump(str_ends_with($text, 'world'));
var_dump(str_ends_with($text, 'World'));
// Пустая подстрока
var_dump(str_ends_with('test', ''));bool(true) bool(true) bool(false) bool(true) bool(true)
<?php
// Когда needle длиннее haystack
var_dump(str_ends_with('abc', 'abcdef'));
// Полное совпадение
var_dump(str_ends_with('test', 'test'));bool(false) bool(true)
Использование substr($haystack, -strlen($needle)) === $needle дает аналогичный результат, но менее читаемо и потенциально менее производительно.
strrpos($haystack, $needle) === strlen($haystack) - strlen($needle) - более сложная конструкция, подверженная ошибкам при пустой строке.
Регулярные выражения preg_match('/' . preg_quote($needle, '/') . '$/') избыточны для простой проверки окончания, но полезны при сложных шаблонах.
Предпочтительнее использовать str_ends_with для проверки фиксированного окончания из-за простоты и ясности кода.
<?php
// Неправильно: перепутаны haystack и needle
var_dump(str_ends_with('.php', 'script.php'));bool(false)
<?php
// Функция преобразует нестроковые значения
var_dump(str_ends_with(12345, 45));
var_dump(str_ends_with(true, '1'));bool(true) bool(false)
<?php
// Вызовет фатальную ошибку в PHP 7.4
var_dump(str_ends_with('test', 'st'));Fatal error: Uncaught Error: Call to undefined function str_ends_with()
Функция str_ends_with была добавлена в PHP 8.0.0. В PHP 8.3 была добавлена функция mb_str_ends_with для работы с многобайтовыми кодировками.
Изначальная реализация не претерпела изменений в поведении с момента добавления. Все изменения касались только внутренней оптимизации.
<?php
function isImageFile($filename) {
$imageExtensions = ['.jpg', '.png', '.gif', '.webp'];
foreach ($imageExtensions as $ext) {
if (str_ends_with($filename, $ext)) {
return true;
}
}
return false;
}
var_dump(isImageFile('photo.jpg'));
var_dump(isImageFile('document.pdf'));bool(true) bool(false)
<?php
$userInput = 'https://site.com/page.php';
$allowedEndings = ['.php', '.html', '.htm'];
$isSafe = false;
foreach ($allowedEndings as $ending) {
if (str_ends_with($userInput, $ending)) {
$isSafe = true;
break;
}
}
echo $isSafe ? 'Valid' : 'Invalid';Valid
<?php
// Для однобайтовых строк
var_dump(str_ends_with('привет', 'вет'));
// Для многобайтовых корректнее использовать mb_str_ends_with (PHP 8.3+)
if (function_exists('mb_str_ends_with')) {
var_dump(mb_str_ends_with('привет', 'вет'));
}bool(true) bool(true)
<?php
function isCorporateEmail($email) {
$corporateDomains = ['.com', '.org', '.net'];
foreach ($corporateDomains as $domain) {
if (str_ends_with($email, $domain)) {
return true;
}
}
return false;
}
var_dump(isCorporateEmail('user@example.com'));
var_dump(isCorporateEmail('user@example.ru'));bool(true) bool(false)
Str ends with в Python
text = 'example.txt'
result = text.endswith('.txt')
print(result) # TrueTrue
Str ends with в Javascript
let str = 'hello world';
console.log(str.endsWith('world')); // true
console.log(str.endsWith('World')); // falsetrue false
Str ends with в MySQL
SELECT 'document.pdf' LIKE '%.pdf';
-- Или
SELECT RIGHT('document.pdf', 4) = '.pdf';1 1
Основное отличие PHP функции - явное указание подстроки для поиска, в то время как LIKE в MySQL использует шаблоны.