2010-07-18 66 views
5

Làm cách nào bạn có thể tìm kiếm một phần chuỗi khi nhập (không sử dụng MySQL) như hàm LIKE trong MySQL nhưng sử dụng PHP khi tìm kiếm chuỗi, ví dụ:Tìm kiếm các chuỗi một phần PHP

<?php  

$string = "Stackoverflow"; 

$find = "overfl"; 

if($find == $string) 
{ 
    return true; 
} 
else 
{ 
    return false 
} 

?> 

Nhưng điều đó rõ ràng sẽ hoạt động, nhưng có chức năng nào bạn có thể tìm kiếm một phần chuỗi không? Đó sẽ là tuyệt vời :)

EDIT:

gì nếu đó là trong một mảng?

nếu tôi sử dụng strpos, nó sẽ lặp lại, Nếu tôi sử dụng nó, nó sẽ giống như truetruetruetruetrue.

Trả lời

12

tôi có xu hướng sử dụng strpos

$needle='appy'; 
$haystack='I\'m feeling flappy, and you?'; 

if(strpos($haystack,$needle)!==false){ 
    //then it was found 
    } 

Nếu bạn muốn nó bỏ qua trường hợp, sử dụng stripos.

Lưu ý rằng sự tinh tế về điều này là nếu kim ở ngay đầu của haystack, ở vị trí 0, số nguyên 0 được trả về. Điều này có nghĩa là bạn phải so sánh với false, sử dụng so sánh nghiêm ngặt hoặc có thể tạo ra giá trị âm sai.

Như đã trình bày trong cuốn hướng dẫn, liên kết ở trên

Warning

Chức năng này có thể trở lại Boolean FALSE, nhưng cũng có thể trả về một giá trị không Boolean mà đánh giá để FALSE, chẳng hạn như 0 hoặc là "". Vui lòng đọc phần trên Booleans để biết thêm thông tin . Sử dụng toán tử === cho kiểm tra giá trị trả về của hàm này.

Theo như sử dụng mảng, strpos có nghĩa là để có hai chuỗi. Sử dụng một mảng sẽ tạo ra Warning: strpos() expects parameter 1 to be string, array given hoặc 1Cảnh báo: strpos(): kim không phải là một chuỗi hoặc số nguyên`.

Được rồi, giả sử bạn có một chuỗi các chuỗi để tìm kiếm.

Bạn có thể

$needles=array('hose','fribb','pancake'); 
$haystack='Where are those pancakes??'; 

foreach($needles as $ndl){ 
    if(strpos($haystack,$ndl)!==false){ echo "'$ndl': found<br>\n"; } 
    else{ echo "'$ndl' : not found<br>\n"; } 
} 

Một cách khác để tìm kiếm nhiều chuỗi trong một chuỗi, mà không sử dụng một mảng ... Đây chỉ cho bạn biết ít nhất một trận đấu đã được tìm thấy.

$haystack='Where are those pancakes??'; 
$match=preg_match('#(hose|fribb|pancake)#',$haystack); 
//$match is now int(1) 

Hoặc sử dụng preg_match_all để xem có bao nhiêu kết quả phù hợp.

$all_matches=preg_match_all('#(hose|fribb|pancake)#',$haystack,$results); 
//all_matches is int(2). Note you also have $results, which stores which needles matched. 

Trong đó, cụm từ tìm kiếm là cụm từ thông dụng. () nhóm các cụm từ lại với nhau và | có nghĩa là 'hoặc'. # biểu thị điểm bắt đầu và kết thúc của mẫu. Regexes có thể trở nên khá phức tạp một cách nhanh chóng, nhưng tất nhiên, chúng hoạt động! Chúng thường được tránh vì lý do hiệu suất, nhưng nếu bạn đang thử nghiệm nhiều chuỗi, điều này có thể hiệu quả hơn so với phương thức lặp mảng được mô tả ở trên. Tôi chắc chắn cũng có những cách khác để làm điều này.

+0

Ok, tốt. Nhưng nếu nó ở trong một mảng thì sao? (kiểm tra bài đăng đã chỉnh sửa). – MacMac

+0

Bạn có nghĩa là haystack là một mảng? Hay kim? Kiểm tra các tài liệu PHP - bình luận đầu tiên hiện là 'strpos chấp nhận một mảng cho $ kim' – JAL

+0

Về cơ bản bạn sẽ phải sử dụng foreach để lặp qua mảng, tùy theo cái nào. preg_match là một giải pháp khả thi nếu bạn có nhiều 'kim' và một 'haystack'. – JAL

3

strstr()/stristr() (các phúc sau case-insensitive)

if(strstr($string,$find)!==false){ 
    //true 
} 
3

strpos() thể làm điều đó.

if(strpos($string, $find) !== false) 
. . . 

Lưu ý rằng nó có thể trả về 0, do đó, hãy sử dụng toán tử loại bằng.

+1

Khi kiểm tra sự tồn tại, nên so sánh nghiêm ngặt với sai ('! == false'). – BoltClock

+0

Có, tôi đã chỉnh sửa trong khi bạn đang đưa ra đề nghị. Cho anh ta một vài giây, được chứ? –

+0

Tôi nghĩ rằng người bỏ phiếu sẽ bỏ phiếu trước khi bạn chỉnh sửa. Nó đã bị thu hồi mặc dù rõ ràng. Không, tôi không phải là người đã downvoted :) – BoltClock

Các vấn đề liên quan