Как я могу написать две функции, которые будут принимать строку и возвращать ее, если она начинается с указанного символа / строки или заканчивается им?
Например:
$str = '|apples}';
echo startsWith($str, '|'); //Returns true
echo endsWith($str, '}'); //Returns true
29 ответов
Вы можете использовать функцию substr_compare
для проверки начала- с и заканчивается на:
function startsWith($haystack, $needle) {
return substr_compare($haystack, $needle, 0, strlen($needle)) === 0;
}
function endsWith($haystack, $needle) {
return substr_compare($haystack, $needle, -strlen($needle)) === 0;
}
Это должно быть одно из самых быстрых решений на PHP 7 (тестовый скрипт). Протестировано на стогах сена 8 КБ, иглами различной длины, а также на полных, частичных и несоответствующих случаях. strncmp
на касание быстрее для начала, но не может проверить окончание.
strrpos
, который (должен) немедленно завершиться неудачей, если игла не совпадает с началом стога сена.
-strlength($haystack)
) и ищем оттуда назад ? Разве это не значит, что вы ничего не ищете? Я также не понимаю !== false
части этого. Я предполагаю, что это полагается на причуду PHP, где одни значения «правдивы», а другие «ложны», но как это работает в этом случае?
xxxyyy
Needle = yyy
и при использовании strrpos
поиск начинается с первого x
. Теперь у нас нет успешного совпадения (найдено x вместо y), и мы больше не можем вернуться назад (мы в начале строки), поиск завершается неудачно немедленно . Об использовании !== false
- strrpos
в приведенном выше примере вернет 0 или false, а не другое значение. Точно так же strpos
в приведенном выше примере может возвращать $temp
(ожидаемое положение) или false. Я выбрал !== false
для единообразия, но вы можете использовать === 0
и === $temp
в функциях соответственно.
Обновлено 23 августа 2016 г.
Функции
function substr_startswith($haystack, $needle) {
return substr($haystack, 0, strlen($needle)) === $needle;
}
function preg_match_startswith($haystack, $needle) {
return preg_match('~' . preg_quote($needle, '~') . '~A', $haystack) > 0;
}
function substr_compare_startswith($haystack, $needle) {
return substr_compare($haystack, $needle, 0, strlen($needle)) === 0;
}
function strpos_startswith($haystack, $needle) {
return strpos($haystack, $needle) === 0;
}
function strncmp_startswith($haystack, $needle) {
return strncmp($haystack, $needle, strlen($needle)) === 0;
}
function strncmp_startswith2($haystack, $needle) {
return $haystack[0] === $needle[0]
? strncmp($haystack, $needle, strlen($needle)) === 0
: false;
}
Тесты
echo 'generating tests';
for($i = 0; $i < 100000; ++$i) {
if($i % 2500 === 0) echo '.';
$test_cases[] = [
random_bytes(random_int(1, 7000)),
random_bytes(random_int(1, 3000)),
];
}
echo "done!\n";
$functions = ['substr_startswith', 'preg_match_startswith', 'substr_compare_startswith', 'strpos_startswith', 'strncmp_startswith', 'strncmp_startswith2'];
$results = [];
foreach($functions as $func) {
$start = microtime(true);
foreach($test_cases as $tc) {
$func(...$tc);
}
$results[$func] = (microtime(true) - $start) * 1000;
}
asort($results);
foreach($results as $func => $time) {
echo "$func: " . number_format($time, 1) . " ms\n";
}
Результаты (PHP 7.0.9)
(Отсортировано от самого быстрого к самому медленному)
strncmp_startswith2: 40.2 ms
strncmp_startswith: 42.9 ms
substr_compare_startswith: 44.5 ms
substr_startswith: 48.4 ms
strpos_startswith: 138.7 ms
preg_match_startswith: 13,152.4 ms
Результаты (PHP 5.3.29)
(Отсортировано от самого быстрого к самому медленному)
strncmp_startswith2: 477.9 ms
strpos_startswith: 522.1 ms
strncmp_startswith: 617.1 ms
substr_compare_startswith: 706.7 ms
substr_startswith: 756.8 ms
preg_match_startswith: 10,200.0 ms
function startswith5b($haystack, $needle) {return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;}
Я добавил ответ ниже.
$haystack[0]
выдаст сообщение об ошибке, если вы не протестируете его с помощью isset. То же и с иглами. Но если вы добавите тесты, это снизит его производительность
Все ответы на данный момент, похоже, выполняют кучу ненужной работы, strlen calculations
, string allocations (substr)
и т. Д. Функции 'strpos'
и 'stripos'
возвращают индекс первого вхождения $needle
в $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;
}
endsWith()
. Его первая строка должна быть (без -1): $expectedPosition = strlen($haystack) - strlen($needle);
strpos($haystack, "$needle", 0)
, если есть хоть какой шанс, что это еще не строка (например, если она исходит от json_decode()
). В противном случае [нечетное] поведение по умолчанию для strpos()
может привести к неожиданным результатам: "Если игла не является строкой, она преобразуется в целое число и применяется как порядковое значение символа. "
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);
}
Кредит для :
Проверить, заканчивается ли строка другой строкой
Проверить, начинается ли строка с другой строки
Обновление PHP 8
PHP 8 включает новые str_starts_with
и < функции href = "https://www.php.net/manual/en/function.str-ends-with.php" rel = "noreferrer"> str_ends_with
, которые, наконец, обеспечивают производительность и удобное решение этой проблемы:
$str = "beginningMiddleEnd";
if (str_starts_with($str, "beg")) echo "printed\n";
if (str_starts_with($str, "Beg")) echo "not printed\n";
if (str_ends_with($str, "End")) echo "printed\n";
if (str_ends_with($str, "end")) echo "not printed\n";
RFC для этой функции предоставляет дополнительную информацию, а также обсуждение достоинств и проблем очевидных ( и не столь очевидные) реализации пользовательского пространства.
На этот вопрос уже есть много ответов, но в некоторых случаях вы можете согласиться на что-то попроще, чем все они. Если искомая строка известна (жестко запрограммирована), вы можете использовать регулярные выражения без каких-либо кавычек и т. Д.
Проверьте, начинается ли строка с "ABC":
preg_match('/^ABC/', $myString); // "^" here means beginning of string
Заканчивается на "ABC":
preg_match('/ABC$/', $myString); // "$" here means end of string
В моем простом случае я хотел проверить, заканчивается ли строка косой чертой:
preg_match('#/$#', $myPath); // Use "#" as delimiter instead of escaping slash
Преимущество: поскольку он очень короткий и простой, вам не нужно определять функцию (например, endsWith()
), как показано выше.
Но опять же - это решение не для каждого случая, просто в этом конкретном случае.
Вышеуказанные функции регулярного выражения, но с другими настройками, также предложенными выше:
function startsWith($needle, $haystack) {
return preg_match('/^' . preg_quote($needle, '/') . '/', $haystack);
}
function endsWith($needle, $haystack) {
return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack);
}
Если для вас важна скорость, попробуйте это (я считаю, что это самый быстрый метод).
Работает только для строк и если $ haystack состоит только из 1 символа
function startsWithChar($needle, $haystack)
{
return ($needle === $haystack[0]);
}
function endsWithChar($needle, $haystack)
{
return ($needle === $haystack[strlen($haystack) - 1]);
}
$str='|apples}';
echo startsWithChar('|',$str); //Returns true
echo endsWithChar('}',$str); //Returns true
echo startsWithChar('=',$str); //Returns false
echo endsWithChar('#',$str); //Returns false
endsWithChar('','x')
, но результат правильный
Creative. Needles which contain haystacks.
... Я не обратил на это достаточно внимания. Спасибо! Я починил это. :)
Самый быстрый результат с решением ():
# Checks if a string ends in a string
function endsWith($haystack, $needle) {
return substr($haystack,-strlen($needle))===$needle;
}
Ориентир :
# This answer
function endsWith($haystack, $needle) {
return substr($haystack,-strlen($needle))===$needle;
}
# Accepted answer
function endsWith2($haystack, $needle) {
$length = strlen($needle);
return $length === 0 ||
(substr($haystack, -$length) === $needle);
}
# Second most-voted answer
function endsWith3($haystack, $needle) {
// search forward starting from end minus needle length characters
if ($needle === '') {
return true;
}
$diff = \strlen($haystack) - \strlen($needle);
return $diff >= 0 && strpos($haystack, $needle, $diff) !== false;
}
# Regex answer
function endsWith4($haystack, $needle) {
return preg_match('/' . preg_quote($needle, '/') . '$/', $haystack);
}
function timedebug() {
$test = 10000000;
$time1 = microtime(true);
for ($i=0; $i < $test; $i++) {
$tmp = endsWith('TestShortcode', 'Shortcode');
}
$time2 = microtime(true);
$result1 = $time2 - $time1;
for ($i=0; $i < $test; $i++) {
$tmp = endsWith2('TestShortcode', 'Shortcode');
}
$time3 = microtime(true);
$result2 = $time3 - $time2;
for ($i=0; $i < $test; $i++) {
$tmp = endsWith3('TestShortcode', 'Shortcode');
}
$time4 = microtime(true);
$result3 = $time4 - $time3;
for ($i=0; $i < $test; $i++) {
$tmp = endsWith4('TestShortcode', 'Shortcode');
}
$time5 = microtime(true);
$result4 = $time5 - $time4;
echo $test.'x endsWith: '.$result1.' seconds # This answer<br>';
echo $test.'x endsWith2: '.$result4.' seconds # Accepted answer<br>';
echo $test.'x endsWith3: '.$result2.' seconds # Second most voted answer<br>';
echo $test.'x endsWith4: '.$result3.' seconds # Regex answer<br>';
exit;
}
timedebug();
Результаты тестов:
10000000x endsWith: 1.5760900974274 seconds # This answer
10000000x endsWith2: 3.7102129459381 seconds # Accepted answer
10000000x endsWith3: 1.8731069564819 seconds # Second most voted answer
10000000x endsWith4: 2.1521229743958 seconds # Regex answer
Вот две функции, которые не вводят временную строку, что может быть полезно, когда иглы достаточно большие:
function startsWith($haystack, $needle)
{
return strncmp($haystack, $needle, strlen($needle)) === 0;
}
function endsWith($haystack, $needle)
{
return $needle === '' || substr_compare($haystack, $needle, -strlen($needle)) === 0;
}
endsWidth
должен делать return $needle==='' || substr_compare(
... чтобы он работал должным образом для -strlen($needle)===0
, что без исправления возвращает endsWith('a','')
возврат false
substr_compare()
, поэтому я добавил PR, чтобы исправить это :)
endsWith('', 'foo')
вызывает предупреждение: «substr_compare (): начальная позиция не может превышать длину начальной строки». Возможно, это еще одна ошибка в substr_compare()
, но чтобы ее избежать, вам нужна предварительная проверка, например ... || (strlen($needle) <= strlen($haystack) && substr_compare(
... ) === 0);
return $needle === '' || @substr_compare(
.., чтобы подавить это предупреждение.
Я понимаю, что это уже закончено, но вы можете посмотреть strncmp поскольку он позволяет вам указать длину строки для сравнения, поэтому:
function startsWith($haystack, $needle, $case=true) {
if ($case)
return strncasecmp($haystack, $needle, strlen($needle)) == 0;
else
return strncmp($haystack, $needle, strlen($needle)) == 0;
}
Вот многобайтовая безопасная версия принятого ответа, она отлично работает для строк UTF-8:
function startsWith($haystack, $needle)
{
$length = mb_strlen($needle, 'UTF-8');
return (mb_substr($haystack, 0, $length, 'UTF-8') === $needle);
}
function endsWith($haystack, $needle)
{
$length = mb_strlen($needle, 'UTF-8');
return $length === 0 ||
(mb_substr($haystack, -$length, $length, 'UTF-8') === $needle);
}
startsWith
должно быть $length = mb_strlen($needle, 'UTF-8');
Вы можете использовать strpos
и < a href = "http://php.net/manual/en/function.strrpos.php" rel = "noreferrer"> strrpos
$bStartsWith = strpos($sHaystack, $sNeedle) == 0;
$bEndsWith = strrpos($sHaystack, $sNeedle) == strlen($sHaystack)-strlen($sNeedle);
strpos($sHaystack, $sNeedle) == 0
, как это strpos($sHaystack, $sNeedle) === 0
? Я вижу ошибку, когда false == 0
оценивается как true
.
Короткие и понятные однострочные сообщения без регулярных выражений.
StartWith () прямолинейный.
function startsWith($haystack, $needle) {
return (strpos($haystack, $needle) === 0);
}
EndWith () использует слегка причудливую и медленную strrev ():
function endsWith($haystack, $needle) {
return (strpos(strrev($haystack), strrev($needle)) === 0);
}
Сосредоточение внимания на startwith, если вы уверены, что строки не пустые, добавление теста к первому символу, перед сравнением, strlen и т. Д., Немного ускоряет работу:
function startswith5b($haystack, $needle) {
return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;
}
Это как-то (на 20% -30%) быстрее. Добавление еще одного теста char, такого как $ haystack {1} === $ Need {1}, похоже, не сильно ускоряет работу, может даже замедлить.
===
кажется быстрее, чем ==
Условный оператор (a)?b:c
кажется быстрее, чем if(a) b; else c;
Для тех, кто спрашивает "почему бы не использовать strpos?" называя другие решения "ненужной работой"
Strpos работает быстро, но не подходит для этой работы.
Чтобы понять, вот небольшая симуляция в качестве примера:
Search a12345678c inside bcdefga12345678xbbbbb.....bbbbba12345678c
Чем занимается компьютер "внутри"?
With strccmp, etc...
is a===b? NO
return false
With strpos
is a===b? NO -- iterating in haysack
is a===c? NO
is a===d? NO
....
is a===g? NO
is a===g? NO
is a===a? YES
is 1===1? YES -- iterating in needle
is 2===3? YES
is 4===4? YES
....
is 8===8? YES
is c===x? NO: oh God,
is a===1? NO -- iterating in haysack again
is a===2? NO
is a===3? NO
is a===4? NO
....
is a===x? NO
is a===b? NO
is a===b? NO
is a===b? NO
is a===b? NO
is a===b? NO
is a===b? NO
is a===b? NO
...
... may many times...
...
is a===b? NO
is a===a? YES -- iterating in needle again
is 1===1? YES
is 2===3? YES
is 4===4? YES
is 8===8? YES
is c===c? YES YES YES I have found the same string! yay!
was it at position 0? NOPE
What you mean NO? So the string I found is useless? YEs.
Damn.
return false
Предполагая, что strlen не выполняет итерацию по всей строке (но даже в этом случае), это совсем не удобно.
Я надеюсь, что ответ ниже может быть эффективным и простым:
$content = "The main string to search";
$search = "T";
//For compare the begining string with case insensitive.
if(stripos($content, $search) === 0) echo 'Yes';
else echo 'No';
//For compare the begining string with case sensitive.
if(strpos($content, $search) === 0) echo 'Yes';
else echo 'No';
//For compare the ending string with case insensitive.
if(stripos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';
//For compare the ending string with case sensitive.
if(strpos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';
В наши дни я обычно использую такую библиотеку, как underscore-php.
require_once("vendor/autoload.php"); //use if needed
use Underscore\Types\String;
$str = "there is a string";
echo( String::startsWith($str, 'the') ); // 1
echo( String::endsWith($str, 'ring')); // 1
В библиотеке полно других полезных функций.
Короче говоря:
function startsWith($str, $needle){
return substr($str, 0, strlen($needle)) === $needle;
}
function endsWith($str, $needle){
$length = strlen($needle);
return !$length || substr($str, - $length) === $needle;
}
ответ от mpen a> невероятно тщательный, но, к сожалению, в предоставленном тесте есть очень важная и вредная оплошность.
Поскольку каждый байт в иголках и стогах сена полностью случайен, вероятность того, что пара иголка-стог сена будет отличаться в самом первом байте, составляет 99,609375%, что означает, что в среднем около 99609 пар из 100000 будут отличаться в самом первом байте. . Другими словами, тест сильно смещен в сторону реализаций startswith
, которые явно проверяют первый байт, как это делает strncmp_startswith2
.
Если вместо этого цикл генерации тестов реализуется следующим образом:
echo 'generating tests';
for($i = 0; $i < 100000; ++$i) {
if($i % 2500 === 0) echo '.';
$haystack_length = random_int(1, 7000);
$haystack = random_bytes($haystack_length);
$needle_length = random_int(1, 3000);
$overlap_length = min(random_int(0, $needle_length), $haystack_length);
$needle = ($needle_length > $overlap_length) ?
substr($haystack, 0, $overlap_length) . random_bytes($needle_length - $overlap_length) :
substr($haystack, 0, $needle_length);
$test_cases[] = [$haystack, $needle];
}
echo " done!<br />";
Результаты тестов говорят о другом:
strncmp_startswith: 223.0 ms
substr_startswith: 228.0 ms
substr_compare_startswith: 238.0 ms
strncmp_startswith2: 253.0 ms
strpos_startswith: 349.0 ms
preg_match_startswith: 20,828.7 ms
Конечно, этот тест может быть не совсем объективным, но он также проверяет эффективность алгоритмов при частично совпадающих иглах.
PHP 8.0
Начиная с PHP 8.0 реализовано два новых метода:
str_starts_with(string $haystack, string $needle): bool
Документация str_starts_with()
str_ends_with(string $haystack, string $needle): bool
Документация str_ends_with()
Однако они чувствительны к регистру. Функции возвращают истину или ложь.
$str = 'apples';
var_dump(str_starts_with($str, 'a')); // bool(true)
var_dump(str_starts_with($str, 'A')); // bool(false)
var_dump(str_ends_with($str, 's')); // bool(true)
var_dump(str_ends_with($str, 'S')); // bool(false)
Сделайте это быстрее:
function startsWith($haystack,$needle) {
if($needle==="") return true;
if($haystack[0]<>$needle[0]) return false; // ------------------------- speed boost!
return (0===substr_compare($haystack,$needle,0,strlen($needle)));
}
Эта дополнительная строка, сравнивая первый символ строк, может сделать false case return немедленно , поэтому многие из ваших сравнений намного быстрее (в 7 раз быстрее, чем я измерял). В действительности, вы практически не платите за производительность для этой единственной линии, поэтому я думаю, что это стоит включить. (Кроме того, на практике, когда вы тестируете много строк для определенного начального фрагмента, большинство сравнений не удастся, поскольку в типичном случае вы что-то ищете.)
ПРИМЕЧАНИЕ: ошибка в комментарии @ Tino ниже уже исправлена
Что касается строк и целых чисел
Если вы хотите принудительно выполнить сравнение строк (то есть вы ожидаете, что startWith ("1234", 12) будет истинным), вам потребуется некоторое приведение типов:
function startsWith($haystack,$needle) {
if($needle==="") return true;
$haystack = (string)$haystack;
$needle = (string)$needle;
if($haystack[0]<>$needle[0]) return false; // ------------------------- speed boost!
return (0===substr_compare($haystack,$needle,0,strlen($needle)));
}
Я не думаю, что это необходимо, но это интересный крайний случай, ведущий к таким вопросам, как "логическое истина начинается с t?" - так что вы решаете, но убедитесь, что вы решили навсегда.
startsWith("123", "0")
дает true
Это может сработать
function startsWith($haystack, $needle) {
return substr($haystack, 0, strlen($needle)) == $needle;
}
Источник: https://stackoverflow.com/a/4419658
Функция substr
может возвращать false
во многих особых случаях, поэтому вот моя версия, которая решает эти проблемы:
function startsWith( $haystack, $needle ){
return $needle === ''.substr( $haystack, 0, strlen( $needle )); // substr's false => empty string
}
function endsWith( $haystack, $needle ){
$len = strlen( $needle );
return $needle === ''.substr( $haystack, -$len, $len ); // ! len=0
}
Тесты (true
означает хорошо):
var_dump( startsWith('',''));
var_dump( startsWith('1',''));
var_dump(!startsWith('','1'));
var_dump( startsWith('1','1'));
var_dump( startsWith('1234','12'));
var_dump(!startsWith('1234','34'));
var_dump(!startsWith('12','1234'));
var_dump(!startsWith('34','1234'));
var_dump('---');
var_dump( endsWith('',''));
var_dump( endsWith('1',''));
var_dump(!endsWith('','1'));
var_dump( endsWith('1','1'));
var_dump(!endsWith('1234','12'));
var_dump( endsWith('1234','34'));
var_dump(!endsWith('12','1234'));
var_dump(!endsWith('34','1234'));
Также стоит обратить внимание на функцию substr_compare
. http://www.php.net/manual/en/function. substr-compare.php
Почему не следующее?
//How to check if a string begins with another string
$haystack = "valuehaystack";
$needle = "value";
if (strpos($haystack, $needle) === 0){
echo "Found " . $needle . " at the beginning of " . $haystack . "!";
}
Выход:
Нашел значение в начале valuehaystack!
Помните, что strpos
вернет false, если игла не была найдена в стоге сена, и вернет 0, если и только если игла была найдена с индексом 0 (также известное как начало).
А вот и концы с:
$haystack = "valuehaystack";
$needle = "haystack";
//If index of the needle plus the length of the needle is the same length as the entire haystack.
if (strpos($haystack, $needle) + strlen($needle) === strlen($haystack)){
echo "Found " . $needle . " at the end of " . $haystack . "!";
}
В этом сценарии нет необходимости в функции startWith () как
(strpos($stringToSearch, $doesItStartWithThis) === 0)
Вернет истину или ложь точно.
Кажется странным, что это так просто, когда здесь безудержно работают все дикие функции.
strpos()
будет медленным, кроме случаев, когда оно действительно совпадает. strncmp()
в этом случае было бы намного лучше.
Я бы сделал это так
function startWith($haystack,$needle){
if(substr($haystack,0, strlen($needle))===$needle)
return true;
}
function endWith($haystack,$needle){
if(substr($haystack, -strlen($needle))===$needle)
return true;
}
Обновление от 2021 г., PHP> 8.0
PHP 8.0
представил str_starts_with
и str_ends_with
.
str_starts_with( string $haystack , string $needle ) : bool
str_ends_with( string $haystack , string $needle ) : bool
В вашем примере у нас будет:
$str = '|apples}';
echo str_starts_with( $str, '|' ); //... true || 1
echo str_ends_with( $str, '}' ); //... true || 1
Основываясь на ответе Джеймса Блэка, вот его конец с версией:
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.
strrev()
является творческим , но очень дорогостоящим, особенно если у вас есть строки, скажем ... 100 КБ.
===
вместо ==
. 0
- это много чего в PHP.
Многие из предыдущих ответов будут работать так же. Тем не менее, это возможно настолько коротко, насколько вы можете сделать это и заставить его делать то, что вы хотите. Вы просто заявляете, что хотите, чтобы он «вернул истину». Поэтому я включил решения, которые возвращают логическое значение true / false и текстовое значение true / false.
// boolean true/false
function startsWith($haystack, $needle)
{
return strpos($haystack, $needle) === 0 ? 1 : 0;
}
function endsWith($haystack, $needle)
{
return stripos($haystack, $needle) === 0 ? 1 : 0;
}
// textual true/false
function startsWith($haystack, $needle)
{
return strpos($haystack, $needle) === 0 ? 'true' : 'false';
}
function endsWith($haystack, $needle)
{
return stripos($haystack, $needle) === 0 ? 'true' : 'false';
}
'true'
и 'false'
как строки, которые оба являются true
в логическом смысле. Хотя это хороший шаблон для чего-то вроде underhanded.xcott.com;)
Без копирования и без внутреннего цикла:
function startsWith(string $string, string $start): bool
{
return strrpos($string, $start, - strlen($string)) !== false;
}
function endsWith(string $string, string $end): bool
{
return ($offset = strlen($string) - strlen($end)) >= 0
&& strpos($string, $end, $offset) !== false;
}
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
s ($ ) -> начинается с ('|')
иs ($ str) - >ndsWith ('}')
полезно, как показано в эта автономная библиотека.str_starts_with
иstr_end_with
: stackoverflow.com/a/64160081/7082164 < / а>