Как реализовать функции startsWith() и endsWith() в PHP
Как создать две PHP функции, которые проверяют, начинается ли строка с указанного символа или подстроки, или заканчивается на него?
Например, мне нужны функции, которые бы:
- Возвращали true, если строка начинается с указанного префикса
- Возвращали true, если строка заканчивается указанным суффиксом
Пример использования:
$str = '|apples}';
echo startsWith($str, '|'); // Должно вернуть true
echo endsWith($str, '}'); // Должно вернуть true
Какой самый эффективный способ реализовать эти функции в PHP, и существуют ли встроенные альтернативы?
PHP предоставляет несколько способов реализации функциональности startsWith() и endsWith(), при этом наиболее эффективным подходом являются встроенные функции str_starts_with() и str_ends_with(), доступные в PHP 8.0 и более поздних версиях. Для более старых версий PHP можно создавать собственные реализации с использованием различных методов манипуляции со строками.
Содержание
- Встроенные функции PHP (PHP 8.0+)
- Собственные реализации для старых версий PHP
- Сравнение производительности
- Лучшие практики и решения, специфичные для фреймворков
- Полные примеры реализации
Встроенные функции PHP (PHP 8.0+)
Начиная с PHP 8.0, можно использовать встроенные функции, которые оптимизированы и безопасны с точки зрения типов:
$str = '|apples}';
// Использование встроенных функций
echo str_starts_with($str, '|'); // Возвращает true
echo str_ends_with($str, '}'); // Возвращает true
Эти функции предлагают несколько преимуществ перед собственными реализациями:
- Безопасность типов: Они выполняют строгую проверку типов
- Производительность: Они реализованы на C и быстрее PHP-альтернатив
- Поддержка Unicode: Правильно обрабатывают многобайтовые символы
- Безопасность при null: Возвращают
falseвместо генерации предупреждений при null-входных данных
В журнале изменений TYPO3 Core особо отмечается, что эти встроенные функции поддерживают правильную типизацию и быстрее предыдущих реализаций.
Собственные реализации для старых версий PHP
Для версий PHP до 8.0 ниже приведены несколько подходов к реализации:
1. Использование сравнения подстрок
function startsWith($haystack, $needle) {
return substr($haystack, 0, strlen($needle)) === $needle;
}
function endsWith($haystack, $needle) {
return substr($haystack, -strlen($needle)) === $needle;
}
2. Использование strpos() для startsWith()
function startsWith($haystack, $needle) {
return strpos($haystack, $needle) === 0;
}
function endsWith($haystack, $needle) {
return strrpos($haystack, $needle) === strlen($haystack) - strlen($needle);
}
3. Использование регулярных выражений
function startsWith($haystack, $needle) {
return preg_match('/^' . preg_quote($needle, '/') . '/', $haystack) === 1;
}
function endsWith($haystack, $needle) {
return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack) === 1;
}
4. Варианты без учета регистра
function startsWithIgnoreCase($haystack, $needle) {
return stripos($haystack, $needle) === 0;
}
function endsWithIgnoreCase($haystack, $needle) {
return stripos(strrev($haystack), strrev($needle)) === 0;
}
Сравнение производительности
Встроенные функции значительно превосходят по производительности собственные реализации:
| Метод | Производительность | Версия PHP | Примечания |
|---|---|---|---|
str_starts_with()/str_ends_with() |
Самый быстрый | PHP 8.0+ | Реализация на основе C |
Сравнение substr() |
Хорошая | Все версии | Надежно и читаемо |
Метод strpos() |
Хорошая | Все версии | Немного быстрее substr |
| Регулярные выражения | Самый медленный | Все версии | Наиболее гибкий, но самый медленный |
Согласно документации TYPO3, встроенные функции PHP 8.0 быстрее их аналогов, реализованных вручную.
Лучшие практики и решения, специфичные для фреймворков
Реализации в фреймворках
Laravel предоставляет удобные вспомогательные функции, как упоминалось в результатах поиска:
// Вспомогательные функции Laravel
starts_with($str, '|'); // Возвращает true
ends_with($str, '}'); // Возвращает true
Современные методы PHP
Для современной разработки на PHP:
- Всегда используйте встроенные функции, когда это возможно (PHP 8.0+)
- Добавляйте подсказки типов для улучшения качества кода
- Учитывайте граничные случаи, такие как пустые иглы (needles)
- Учитывайте производительность для операций с высокой частотой
Полная реализация с безопасностью типов
function startsWith(string $haystack, string $needle): bool {
if ($needle === '') {
return true;
}
return str_starts_with($haystack, $needle);
}
function endsWith(string $haystack, string $needle): bool {
if ($needle === '') {
return true;
}
return str_ends_with($haystack, $needle);
}
Для совместимости с PHP < 8.0:
function startsWith(string $haystack, string $needle): bool {
if ($needle === '') {
return true;
}
return substr($haystack, 0, strlen($needle)) === $needle;
}
function endsWith(string $haystack, string $needle): bool {
if ($needle === '') {
return true;
}
return substr($haystack, -strlen($needle)) === $needle;
}
Полные примеры реализации
Вот комплексное решение, которое работает в разных версиях PHP:
<?php
/**
* Проверяет, начинается ли строка с заданного префикса
*
* @param string $haystack Строка для поиска
* @param string $needle Префикс для поиска
* @return bool True, если строка начинается с префикса
*/
function startsWith(string $haystack, string $needle): bool {
if ($needle === '') {
return true;
}
if (function_exists('str_starts_with')) {
return str_starts_with($haystack, $needle);
}
return substr($haystack, 0, strlen($needle)) === $needle;
}
/**
* Проверяет, заканчивается ли строка заданным суффиксом
*
* @param string $haystack Строка для поиска
* @param string $needle Суффикс для поиска
* @return bool True, если строка заканчивается суффиксом
*/
function endsWith(string $haystack, string $needle): bool {
if ($needle === '') {
return true;
}
if (function_exists('str_ends_with')) {
return str_ends_with($haystack, $needle);
}
return substr($haystack, -strlen($needle)) === $needle;
}
// Примеры использования
$str = '|apples}';
echo startsWith($str, '|') ? 'true' : 'false'; // true
echo endsWith($str, '}') ? 'true' : 'false'; // true
// Граничные случаи
echo startsWith('hello', '') ? 'true' : 'false'; // true (пустой префикс)
echo endsWith('hello', '') ? 'true' : 'false'; // true (пустой суффикс)
?>
Эта реализация:
- Автоматически определяет версию PHP и использует оптимальные функции
- Правильно обрабатывает пустые иглы (возвращает true)
- Предоставляет подсказки типов для лучшей поддержки IDE
- Работает во всех версиях PHP с последовательным поведением
- Обратная совместима с шаблоном использования из примера
Источники
- Журнал изменений TYPO3 Core - Устаревание StringUtility::beginsWith() и StringUtility::endsWith()
- Перестаньте гадать! Окончательный код PHP String Starts With (PHP 5-8+)
- PHP - Википедия
- Обратная строка в PHP – Простые примеры кода
Заключение
При реализации функциональности startsWith() и endsWith() в PHP учтите следующие ключевые моменты:
- Для PHP 8.0+: Всегда используйте встроенные функции
str_starts_with()иstr_ends_with()для оптимальной производительности и безопасности типов - Для старых версий PHP: Реализуйте собственные функции с использованием сравнения
substr()для лучшей производительности и читаемости - Интеграция с фреймворками: Используйте вспомогательные функции фреймворков, такие как
starts_with()иends_with()в Laravel, когда они доступны - Обработка граничных случаев: Всегда учитывайте пустые иглы и согласованность типов
- Производительность имеет значение: Выбирайте правильную реализацию на основе вашей версии PHP и требований к производительности
Наиболее эффективный подход - использование встроенных функций PHP, когда они доступны, и переход к хорошо протестированным собственным реализациям для старых версий. Это обеспечивает как производительность, так и совместимость в различных средах PHP.