Вы не можете. Объекты в векторе будут sliced - любые данные экземпляра производного класса будут отрублены, поэтому вызов метода будет очень плохой идеей.
Если , с другой стороны, у вас есть вектор указателей для базы, тогда вы просто вызываете виртуальный метод и вызывается версия производного класса.
function startsWith($haystack, $needle)
{
$length = strlen($needle);
return (substr($haystack, 0, $length) === $needle);
}
function endsWith($haystack, $needle)
{
$length = strlen($needle);
if ($length == 0) {
return true;
}
return (substr($haystack, -$length) === $needle);
}
Используйте это, если вы не хотите использовать регулярное выражение.
Без копий и no-intern-loop:
function startsWith($string, $start)
{
return strrpos($string, $start, -strlen($string)) !== false;
}
function endsWith($string, $end)
{
return ($offset = strlen($string) - strlen($end)) >= 0
&& strpos($string, $end, $offset) !== false;
}
function startsWith($haystack, $needle, $case = true) {
if ($case) {
return (strcmp(substr($haystack, 0, strlen($needle)), $needle) === 0);
}
return (strcasecmp(substr($haystack, 0, strlen($needle)), $needle) === 0);
}
function endsWith($haystack, $needle, $case = true) {
if ($case) {
return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
}
return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0);
}
Кредит :
Все ответы на данный момент, похоже, выполняют кучу ненужной работы, вычисления strlen
, выделения строк (substr)
и т. Д. ' Функции strpos '
и ' stripos '
возвращают индекс первого вхождения $ Need
в $ haystack
:
function startsWith($haystack,$needle,$case=true)
{
if ($case)
return strpos($haystack, $needle, 0) === 0;
return stripos($haystack, $needle, 0) === 0;
}
function endsWith($haystack,$needle,$case=true)
{
$expectedPosition = strlen($haystack) - strlen($needle);
if ($case)
return strrpos($haystack, $needle, 0) === $expectedPosition;
return strripos($haystack, $needle, 0) === $expectedPosition;
}
Функции регулярного выражения выше, но с другие настройки, также предложенные выше:
function startsWith($needle, $haystack) {
return preg_match('/^' . preg_quote($needle, '/') . '/', $haystack);
}
function endsWith($needle, $haystack) {
return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack);
}
Я понимаю, что это было закончено, но вы можете посмотреть на strncmp , поскольку он позволяет вам указать длину строки для сравнения, поэтому:
function startsWith($haystack, $needle, $case=true) {
if ($case)
return strncasecmp($haystack, $needle, strlen($needle)) == 0;
else
return strncmp($haystack, $needle, strlen($needle)) == 0;
}
Основываясь на ответе Джеймса Блэка, вот его endWith version:
function startsWith($haystack, $needle, $case=true) {
if ($case)
return strncmp($haystack, $needle, strlen($needle)) == 0;
else
return strncasecmp($haystack, $needle, strlen($needle)) == 0;
}
function endsWith($haystack, $needle, $case=true) {
return startsWith(strrev($haystack),strrev($needle),$case);
}
Примечание: я заменил часть if-else на функцию Джеймса Блэка startWith, потому что strncasecmp на самом деле является нечувствительной к регистру версией strncmp.
Если для вас важна скорость, попробуйте это. (Я считаю, что это самый быстрый метод)
Работает только для строк, и если $ haystack состоит только из 1 символа
function startsWithChar($needle, $haystack)
{
return ($needle[0] === $haystack);
}
function endsWithChar($needle, $haystack)
{
return ($needle[strlen($needle) - 1] === $haystack);
}
$str='|apples}';
echo startsWithChar($str,'|'); //Returns true
echo endsWithChar($str,'}'); //Returns true
echo startsWithChar($str,'='); //Returns false
echo endsWithChar($str,'#'); //Returns false