Как сделать strpos нечувствительным к регистру

#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 />;
}