2010-03-27 25 views
5

Giải pháp: strpos hóa ra là hiệu quả nhất. Có thể được thực hiện với substr nhưng điều đó tạo ra một chuỗi con tạm thời. Cũng có thể được thực hiện với regex, nhưng chậm hơn strpos và không luôn luôn sản xuất câu trả lời đúng nếu từ chứa meta-ký tự (xem Ayman Hourieh bình luận).khớp một từ với đuôi bằng strpos

câu trả lời Chosen:

if(strlen($str) - strlen($key) == strrpos($str,$key)) 
    print "$str ends in $key"; // prints Oh, hi O ends in O 

và tốt nhất để kiểm tra bình đẳng nghiêm ngặt === (xem David câu trả lời)

Nhờ tất cả để giúp đỡ.


Tôi đang cố gắng đối sánh một từ trong chuỗi để xem liệu từ đó có xuất hiện ở cuối chuỗi đó hay không. Thông thường strpos($theString, $theWord); sẽ không làm điều đó.

Về cơ bản nếu $theWord = "my word";

$theString = "hello myword";  //match 
$theString = "myword hello";  //not match 
$theString = "hey myword hello"; //not match 

Điều gì sẽ là cách hiệu quả nhất để làm điều đó?

P.S. Trong tiêu đề tôi đã nói strpos, nhưng nếu một cách tốt hơn tồn tại, đó là ok quá.

+0

Bạn có ý gì bởi "từ"? Văn bản phân tách không gian? Khóa "foo" có khớp với "barfoo" hay chỉ "bar foo" không? –

+0

@Nick, nếu '$ word =" foo ";' thì cả hai '$ sentence =" barfoo "hoặc" bar foo ";' vẫn nên 'khớp'. Nó không quan trọng trong trường hợp này nếu nó có một không gian trước khi nó hay không. – clover

+0

có thể trùng lặp của [Kiểm tra hiệu quả nhất cho dù chuỗi PHP kết thúc bằng một chuỗi khác là gì?] (Http://stackoverflow.com/questions/619610/whats-the-most-efficient-test-of-whether-a- php-string-ends-with-another-string) – Gajus

Trả lời

5

Bạn có thể tận dụng strrpos chức năng cho việc này:

$str = "Oh, hi O"; 
$key = "O"; 

if(strlen($str) - strlen($key) == strrpos($str,$key)) 
    print "$str ends in $key"; // prints Oh, hi O ends in O 

hoặc một giải pháp dựa regex như:

if(preg_match("#$key$#",$str)) { 
print "$str ends in $key"; // prints Oh, hi O ends in O 
} 
+0

Giải pháp regex không phải lúc nào cũng tạo ra kết quả chính xác. Xem nhận xét của tôi về câu trả lời của @ jjclarkson. –

+0

@Ayman, cảm ơn vì đã chỉ ra. Sẽ cập nhật tóm tắt của chuỗi. – clover

+0

@Aryam: OP muốn đối sánh một từ không chỉ bất kỳ chuỗi nào. Bây giờ tôi đã giả định một từ sẽ là chữ cái hoặc chữ số. Nếu từ có thể chứa bất kỳ char nào trong đó một số có thể là regex meta char, điều này sẽ không hoạt động và chúng ta sẽ phải thoát khỏi metas. – codaddict

0

Bạn có thể sử dụng số regular expression.

if(preg_match('/'.$theWord.'$/', $theString)) { 
    //matches at the end of the string 
} 

Hoặc bạn có thể sử dụng strrpos() và thêm độ dài của từ. (strrpos - "Tìm vị trí của lần xuất hiện cuối cùng của một char trong một chuỗi") Sau đó, xem đó có phải là vị trí của ký tự cuối cùng trong chuỗi không.

+2

Không tạo ra kết quả chính xác nếu '$ theWord' chứa các ký tự meta. Hãy thử nó với '$ theWord' được đặt thành' '.'' chẳng hạn. –

+0

Khá đúng, bạn chắc chắn phải xác nhận từ và/hoặc thoát khỏi các ký tự meta. – jjclarkson

+0

Nó có thể chậm hơn so với phương pháp đầu tiên của codaddict. –

1

strpos có thể là hiệu quả nhất trong một số trường hợp, nhưng bạn cũng có thể substr với giá trị âm như tham số thứ hai để đếm ngược từ cuối chuỗi:

$theWord = "my word"; 
$theWordLen = strlen($theWord); 

$theString = "hello myword"; 
$matches = ($theWord ==substr($theString, -1 * $theWordLen); 
+1

Những bất lợi của phương pháp này là bạn đang tạo ra một chuỗi tạm thời từ kết quả "chất nền". Phương pháp strrpos được đề cập bởi codaddict có lẽ nhanh hơn (mặc dù bạn sẽ muốn kiểm tra sự bình đẳng nghiêm ngặt). – David

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