Как я могу написать две функции, которые будут принимать строку и возвращать, если она начинается с указанного символа / строки или заканчивается этим?
Например:
$str = '|apples}';
echo startsWith($str, '|'); //Returns true
echo endsWith($str, '}'); //Returns true
s($str)->startsWith('|')
иs($str)->endsWith('}')
помочь, как найти в этой автономной библиотеке .Ответы:
Используйте это, если вы не хотите использовать регулярные выражения.
источник
$length
не требуется в последней строкеendsWith()
.return substr($haystack, -strlen($needle))===$needle;
if
вовсе, передав в$length
качестве третьего параметраsubstr
:return (substr($haystack, -$length, $length);
. Это обрабатывает случай$length == 0
, возвращая пустую строку, а не всю$haystack
.Вы можете использовать
substr_compare
функцию для проверки начала и конца:Это должно быть одним из самых быстрых решений на 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 г.
функции
тесты
Результаты (PHP 7.0.9)
(Отсортировано от самого быстрого до самого медленного)
Результаты (PHP 5.3.29)
(Отсортировано от самого быстрого до самого медленного)
startswith_benchmark.php
источник
function startswith5b($haystack, $needle) {return ($haystack{0}==$needle{0})?strncmp($haystack, $needle, strlen($needle)) === 0:FALSE;}
я добавил ответ ниже.Все ответы до сих пор , кажется, делают кучу ненужной работы,
strlen calculations
,string allocations (substr)
и т.д. ,'strpos'
и'stripos'
функции возвращают индекс первого вхождения$needle
в$haystack
:источник
endsWith()
Функция имеет ошибку. Его первая строка должна быть (без -1):$expectedPosition = strlen($haystack) - strlen($needle);
strpos($haystack, "$needle", 0)
если есть какой - нибудь шанс , что это не является строкой (например, если это исходит отjson_decode()
). В противном случае поведение по умолчанию [нечетное]strpos()
может привести к неожиданным результатам: « Если игла не является строкой, она преобразуется в целое число и применяется в качестве порядкового значения символа. »Кредит для :
Проверьте, заканчивается ли строка другой строкой
Проверьте, начинается ли строка с другой строки
источник
Регулярное выражение работает выше, но с другими настройками, также предложенными выше:
источник
На этот вопрос уже есть много ответов, но в некоторых случаях вы можете согласиться на что-то более простое, чем все они. Если искомая строка известна (жестко закодирована), вы можете использовать регулярные выражения без кавычек и т. Д.
Проверьте, начинается ли строка с 'ABC':
заканчивается на «ABC»:
В моем простом случае я хотел проверить, заканчивается ли строка косой чертой:
Преимущество: поскольку оно очень короткое и простое, вам не нужно определять функцию (такую как
endsWith()
), как показано выше.Но опять же - это не решение для каждого случая, только это очень конкретное.
источник
@
, чтобы избежать косой черты (/
). Смотрите пример № 3 здесь: php.net/manual/en/function.preg-match.php .Если скорость важна для вас, попробуйте это (я считаю, что это самый быстрый метод)
Работает только для строк и если $ haystack только 1 символ
источник
endsWithChar('','x')
но результат верныйВот две функции, которые не вводят временную строку, которая может быть полезна, когда иглы существенно большие:
источник
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, так как он позволяет вам сравнивать длину строки, поэтому:
источник
Вы можете использовать
strpos
иstrrpos
источник
strpos($sHaystack, $sNeedle) == 0
как этоstrpos($sHaystack, $sNeedle) === 0
? Я вижу ошибку, когдаfalse == 0
оцениваетtrue
.Вот безопасная многобайтовая версия принятого ответа, она отлично работает для строк UTF-8:
источник
startsWith
нем должно быть$length = mb_strlen($needle, 'UTF-8');
Короткие и понятные однострочники без регулярных выражений.
начинается с () прямо вперед.
endWith () использует слегка причудливую и медленную strrev ():
источник
Сосредоточив внимание на запуске с, если вы уверены, что строки не пусты, добавление теста для первого символа перед сравнением, strlen и т. Д. Немного ускоряет процесс:
Это как-то (20% -30%) быстрее. Добавление еще одного теста с символами, такого как $ haystack {1} === $ needle {1}, похоже, не сильно ускоряет, а может даже замедлять.
===
кажется быстрее чем==
условный оператор(a)?b:c
кажется быстрее чемif(a) b; else c;
Для тех, кто спрашивает "почему бы не использовать strpos?" называя другие решения "ненужной работой"
strpos быстр, но не подходит для этой работы.
Чтобы понять, вот небольшая симуляция в качестве примера:
Что делает компьютер "внутри"?
Предполагая, что strlen не выполняет итерацию всей строки (но даже в этом случае), это совсем не удобно.
источник
Я надеюсь, что приведенный ниже ответ может быть эффективным и простым:
источник
Я обычно заканчиваю тем, что хожу с библиотекой типа underscore-php в эти дни.
Библиотека полна других полезных функций.
источник
Ответ на mpen невероятно тщательно, но, к сожалению, при условии , тест имеет очень важный и вредный надзор.
Поскольку каждый байт в иголках и стогах сена является абсолютно случайным, вероятность того, что пара иголка-стог будет отличаться в самом первом байте, составляет 99,609375%, что означает, что в среднем около 99609 из 100000 пар будут отличаться в самом первом байте , Другими словами, эталонный тест сильно смещен в сторону
startswith
реализаций, которые явно проверяют первый байт, что иstrncmp_startswith2
делает.Если цикл генерации тестов реализован следующим образом:
результаты тестов рассказывают немного другую историю:
Конечно, этот эталонный тест все еще не может быть абсолютно беспристрастным, но он также проверяет эффективность алгоритмов, когда используются частично совпадающие иглы.
источник
короче говоря:
источник
Просто рекомендация:
Эта дополнительная строка, сравнивающая первый символ строк, может немедленно вернуть ложный регистр , поэтому многие ваши сравнения будут намного быстрее (в 7 раз быстрее, когда я измерял). В истинном случае вы практически не платите за производительность этой единственной линии, так что я думаю, что это стоит того. (Кроме того, на практике, когда вы тестируете много строк для определенного начального блока, большинство сравнений не пройдут, поскольку в типичном случае вы что-то ищете.)
источник
startsWith("123", "0")
даетtrue
substr
Функция может возвращатьfalse
во многих частных случаях, так вот моя версия, которая занимается этими вопросами:Тесты (
true
значит хорошо):Кроме того,
substr_compare
функция также стоит посмотреть. http://www.php.net/manual/en/function.substr-compare.phpисточник
Это может сработать
Источник: https://stackoverflow.com/a/4419658
источник
Я бы сделал это так
источник
Основываясь на ответе Джеймса Блэка, вот его конец с версией:
Примечание: я поменял местами if-else для функции JamesW Black StartSith, потому что strncasecmp на самом деле является нечувствительной к регистру версией strncmp.
источник
strrev()
это креативно, но очень дорого, особенно если у вас есть, скажем, 100Kb.===
вместо того,==
чтобы быть уверенным.0
равно многим вещам в PHP.Почему не следующее?
Вывод:
Имейте в виду,
strpos
вернет false, если иголка не была найдена в стоге сена, и вернет 0, если и только если игла была найдена с индексом 0 (AKA начало).И вот кончается с:
В этом сценарии нет необходимости использовать функцию launchWith () как
вернет true или false точно.
Кажется странным, что это так просто, когда все дикие функции работают безудержно.
источник
strpos()
будет медленным, кроме случаев, когда оно совпадает.strncmp()
было бы намного лучше в этом случае.Многие из предыдущих ответов будут работать так же хорошо. Тем не менее, это, возможно, так коротко, как вы можете сделать это и сделать то, что вы хотите. Вы просто заявляете, что хотите, чтобы он «вернул истину». Поэтому я включил решения, которые возвращают логическое значение true / false и текстовое значение true / false.
источник
'true'
и в'false'
виде строк, которые обаtrue
имеют логическое значение. Это хороший пример для чего-то вроде underhanded.xcott.com ;)Вы также можете использовать регулярные выражения:
источник
preg_quote($needle, '/')
.Без копирования и без внутреннего цикла:
источник
Вот эффективное решение для PHP 4. Вы можете получить более быстрые результаты, если на PHP 5, используя
substr_compare
вместоstrcasecmp(substr(...))
.источник
Вы можете использовать функцию fnmatch для этого.
источник