2011-07-22 24 views
37

Làm thế nào tôi có thể thay đổi strpos để làm cho nó không phân biệt chữ hoa chữ thường. Lý do là nếu product->nameMadBike và cụm từ tìm kiếm là xe đạp, nó sẽ không lặp lại liên kết cho tôi. Mối quan tâm chính của tôi là tốc độ của mã.Làm thế nào để làm cho trường hợp strpos không nhạy cảm

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

Trả lời

64

Bạn đang tìm kiếm stripos()

Nếu đó không phải là có sẵn cho bạn, sau đó chỉ cần gọi strtolower() trên cả hai dây đầu tiên.

EDIT:

stripos() sẽ không hoạt động, khi bạn muốn tìm substr với dấu phụ.

Ví dụ:

stripos("Leży Jerzy na wieży i nie wierzy, że na wieży leży dużo JEŻY","jeży"); lợi nhuận sai, nhưng nên int (68).

+0

Nhanh như strpos? – EnexoOnoma

+3

Không, nhưng nó nhanh hơn một chút so với sử dụng 'strtolower()' trước; trung bình, nó ('stripos') dường như mất khoảng 2,5 lần dài hơn (' strpos'). Sau đó, một lần nữa, bạn vẫn có thể làm điều đó ('stripos') một triệu lần mỗi giây, vì vậy tôi sẽ không lo lắng nhiều về nó - tối ưu hóa sớm là gốc rễ của mọi điều ác. – Dereleased

+0

Về lý thuyết, không có giải pháp có thể được, bởi vì có nhiều so sánh được thực hiện. Nhưng đây là một số dữ liệu: http://lzone.de/articles/php-string-search.htm – Turnsole

1

'i' trong stripos() nghĩa phân biệt dạng chữ

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

làm cho cả hai tên & $ searchterm chữ thường trước khi đến $ strpos.

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

if(strpos($haystack, $needle) !== false){ 
    echo "Match = ".$product->link."<br />; 
} 
Các vấn đề liên quan