2010-10-13 43 views
7

Tôi đang viết một trang PHP phân tích cú pháp URL đã cho. Những gì tôi có thể làm là tìm thấy sự xuất hiện đầu tiên chỉ, nhưng khi tôi echo nó, tôi nhận được một giá trị chứ không phải là nhất định.Tìm nhiều vị trí chuỗi trong PHP

đây là những gì tôi đã làm cho đến bây giờ.

<?php 
$URL = @"my URL goes here";//get from database 
$str = file_get_contents($URL); 
$toFind = "string to find"; 
$pos = strpos(htmlspecialchars($str),$toFind); 
echo substr($str,$pos,strlen($toFind)) . "<br />"; 
$offset = $offset + strlen($toFind); 
?> 

Tôi biết rằng vòng lặp có thể được sử dụng, nhưng tôi không biết điều kiện không phải là nội dung của vòng lặp.

Và làm cách nào tôi có thể hiển thị kết quả tôi cần?

+0

Tôi không biết chính xác những gì bạn muốn với mã này, nhưng có vẻ như không rõ ràng với tôi những gì biến bạn muốn có được trên với. Tại thời điểm này, bạn có nghĩa vụ phải echo chính xác nội dung của $ toFind, vậy tại sao không echo $ toFind khi một kết hợp được tìm thấy? Hoặc là $ pos của quá nhiều tầm quan trọng với bạn? Tuy nhiên, vấn đề dường như bắt nguồn từ hàm htmlspecialchars(), có thể làm tăng độ dài và bố cục của chuỗi gốc. Nếu bạn muốn hiển thị văn bản phù hợp, hãy chắc chắn rằng bạn sử dụng nó trên dòng chất nền là tốt. –

+0

@Pelle ten Cate: như bạn có thể thấy, câu trả lời được gửi bởi codaddict giống như của bạn.Và tôi không muốn lặp lại $ toFind, vì tôi sẽ sử dụng vị trí được tìm thấy để lấy một số nội dung sau khi tôi tìm thấy. – sikas

Trả lời

16

Điều này xảy ra vì bạn đang sử dụng strpos trên htmlspecialchars($str) nhưng bạn đang sử dụng substr trên $str.

htmlspecialchars() chuyển đổi các ký tự đặc biệt thành thực thể HTML. Lấy một ví dụ nhỏ:

// search 'foo' in '&foobar' 

$str = "&foobar"; 
$toFind = "foo"; 

// htmlspecialchars($str) gives you "&amp;foobar" 
// as & is replaced by &amp;. strpos returns 5 
$pos = strpos(htmlspecialchars($str),$toFind); 

// now your try and extract 3 char starting at index 5!!! in the original 
// string even though its 'foo' starts at index 1. 
echo substr($str,$pos,strlen($toFind)); // prints ar 

Để khắc phục điều này sử dụng cùng Haystack trong cả hai chức năng.

Để trả lời cho bạn câu hỏi khác về việc tìm tất cả các lần xuất hiện của một chuỗi trong chuỗi khác, bạn có thể sử dụng đối số thứ 3 của strpos, bù trừ, chỉ định vị trí cần tìm kiếm từ đó. Ví dụ:

$str = "&foobar&foobaz"; 
$toFind = "foo"; 
$start = 0; 
while($pos = strpos(($str),$toFind,$start) !== false) { 
     echo 'Found '.$toFind.' at position '.$pos."\n"; 
     $start = $pos+1; // start searching from next position. 
} 

Output:

Tìm thấy foo ở vị trí 1
Tìm thấy foo ở vị trí 8

+0

Để xây dựng một chút, htmlspecialchars thay thế một số ký tự với một số mới, có nghĩa là bạn không thể sử dụng cùng một chỉ mục trong cả hai chuỗi và mong đợi kết quả tương tự. – dutt

+0

Điều này giải quyết được một vấn đề là đầu ra. Nhưng còn vấn đề khác thì sao? – sikas

+0

Đó là những gì tôi đang tìm kiếm: D ... cảm ơn bạn. – sikas

5

Sử dụng:

while(($pos = strpos(($str),$toFind,$start)) != false) { 

explenation: Đặt ) sau sai đằng sau $start), sao cho $pos = strpos(($str),$toFind,$start) được đặt giữa ().

Cũng sử dụng != false, vì php.net nói: '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 "". Vui lòng đọc phần trên Booleans để biết thêm thông tin. Sử dụng toán tử === để kiểm tra giá trị trả lại của hàm này.

+0

Đây là số duy nhất không tạo vòng lặp vô hạn – jocken

3
$string = '\n;alskdjf;lkdsajf;lkjdsaf \n hey judeee \n'; 
$pattern = '\n'; 
$start = 0; 
while(($newLine = strpos($string, $pattern, $start)) !== false){ 
    $start = $newLine + 1; 
    echo $newLine . '<br>'; 
} 

này hoạt động ra khỏi cổng, và không chạy một vòng lặp vô hạn như trên, và ==! Cho phép một trận đấu ở vị trí 0.

+0

Đồng ý , câu trả lời được chấp nhận ở trên gần như móng tay vấn đề nhưng $ pos luôn luôn TRUE mà đánh giá đến 1 khi in ra, dẫn đến một vòng lặp vô hạn ... nhờ @ user1371910 & marco – Carlton

1
$offset=0; 
$find="is"; 
$find_length= strlen($find); 
$string="This is an example string, and it is an example"; 
while ($string_position = strpos($string, $find, $offset)) { 
    echo '<strong>'.$find.'</strong>'.' Found at '.$string_position.'</br>'; 
    $offset=$string_position+$find_length; 
} 
Các vấn đề liên quan