#php #codeigniter
#php #strpos
Вопрос:
Как я могу изменить strpos, чтобы он не учитывал регистр. Причина в том, что если product->name
это MadBike, а поисковый запрос — bike, он не будет повторять мне ссылку. Моя главная проблема — скорость кода.
<?php
$xml = simplexml_load_file('test.xml');
$searchterm = "bike";
foreach ($xml->product as $product) {
if (strpos($product->name, $searchterm) !== false ) {
echo $product->link;
} }
?>
Ответ №1:
Вы ищете stripos()
Если это вам недоступно, то сначала просто вызовите strtolower()
обе строки.
Редактировать:
stripos()
не будет работать, если вы хотите найти подстроку с диакритическим знаком.
Например:
stripos("Leży Jerzy na wieży i nie wierzy, że na wieży leży dużo JEŻY","jeży");
возвращает false
, но он должен вернуться int(68)
.
Комментарии:
1. Нет, но это немного быстрее, чем использование
strtolower()
first; в среднем, это (stripos
), кажется, занимает примерно в 2,5 раза больше времени (чемstrpos
). Опять же, вы все равно можете делать это (stripos
) миллион раз в секунду, поэтому я бы не стал сильно беспокоиться об этом — преждевременная оптимизация — корень всего зла.2. Теоретически, никакого решения быть не может, потому что нужно сделать больше сравнений. Но вот некоторые данные: lzone.de/articles/php-string-search.htm
3. Это правда, и мои цифры основаны на поиске коротких строк (миллион раз в секунду комментарий); очевидно, что чем длиннее строка, тем больше времени она занимает, и даже дольше для stripos. Однако в этом вопросе кажется, что строки, как правило, будут короткими.
4. Например, если я увеличу размер моей строки поиска на порядок, stripos увеличится с 0,2 секунды на 200 000 поисковых запросов до 0,9 секунды; однако strpos увеличится с 0,08 до 0,11
5. Так что это не разница, как вы сказали, преждевременная оптимизация. Правильно ли stripos быстрее, чем preg_match?
Ответ №2:
http://www.php.net/manual/en/function.stripos.php
stripos() не чувствителен к регистру.
Комментарии:
1. Комментарий Dereleased не отображался до того, как я нажал enter. Сообщение ninja’d!
2. Я обвиняю интернет-эльфов, блокирующих трубки устаревшей серверной пылью.
Ответ №3:
‘i’ в stripos() означает нечувствительный к регистру
if(stripos($product->name, $searchterm) !== false){ //'i' case insensitive
echo "Match = ".$product->link."<br />;
}
Ответ №4:
сделайте оба имени и $searchterm строчными перед $strpos.
$haystack = strtolower($product->name);
$needle = strtolower($searchterm);
if(strpos($haystack, $needle) !== false){
echo "Match = ".$product->link."<br />;
}