2011-07-22 13 views
37

W jaki sposób mogę zmienić ustawienia strpos tak, aby wielkość liter nie była rozróżniana. Dzieje się tak dlatego, jeśli jest MadBike, a wyszukiwane hasło to rower nie spowoduje wyświetlenia mi linku. Moim głównym zmartwieniem jest szybkość kodu.Jak zrobić niewrażliwą obudowę strpos?

<?php 
$xml = simplexml_load_file('test.xml'); 
$searchterm = "bike"; 
foreach ($xml->product as $product) { 
if (strpos($product->name, $searchterm) !== false) { 
echo $product->link; 
} } 
?> 

Odpowiedz

64

Szukacie stripos()

Jeśli to nie jest dostępne, a potem po prostu zadzwonić strtolower() obu ciągów pierwszy.

EDIT:

stripos() nie będzie działać, gdy chcesz znaleźć substr z diakrytyczny znak.

Na przykład:

stripos("Leży Jerzy na wieży i nie wierzy, że na wieży leży dużo JEŻY","jeży"); wraca fałszywe, ale powinny int (68).

+0

Czy jest tak szybki jak strpos? – EnexoOnoma

+3

Nie, ale jest nieco szybszy niż przy użyciu 'strtolower()'; średnio ("stripos") wydaje się trwać około 2,5 razy dłużej (niż 'strpos'). Z drugiej strony, nadal możesz to robić ("stripos") milion razy na sekundę, więc nie martwiłbym się tak bardzo - przedwczesna optymalizacja jest źródłem wszelkiego zła. – Dereleased

+0

Teoretycznie żadne rozwiązanie nie może być, ponieważ trzeba dokonać dalszych porównań. Ale tutaj są pewne dane: http://lzone.de/articles/php-string-search.htm – Turnsole

1

'i' w stripos() oznacza przypadek niewrażliwe

if(stripos($product->name, $searchterm) !== false){ //'i' case insensitive 
     echo "Match = ".$product->link."<br />; 
    } 
0

dokonać zarówno nazwa & $ SEARCHTERM małe litery przed $ strpos.

$haystack = strtolower($product->name); 
$needle = strtolower($searchterm); 

if(strpos($haystack, $needle) !== false){ 
    echo "Match = ".$product->link."<br />; 
}