2011-06-30 51 views
2

有strpos()查找第一個匹配項,strrpos()查找最後一個匹配項。PHP:如何使用stripos查找(用戶定義的)字符串的位置

This教程解釋說有可能使用循環獲得任何發生,但當乾草堆很大時可能不會很快。而我的代碼現在看起來很醜陋。

有沒有找到第二,第三,第四等發生沒有循環乾草堆?我的意思是,直接找到所需的事件而無需循環?可能?

+1

你不能。即使沒有循環,你調用的函數(比如'findall()')最終會使用循環。 –

+0

@eyazici我的意思是,我只想找到一個特定的事件,讓我們說只有第四次發生,如果我只想要第四次發生,我必須使用循環嗎? – evilReiko

+0

如果沒有訪問每個位置至少一次,程序就無法知道字符串中包含的內容,因此,如果沒有某種索引,無論它是代碼中的循環還是內置函數,都必須訪問每個角色。你想擔心的是** N^2 **循環或更糟。本教程中的示例並不是那麼糟糕,因爲它在循環的每個下一次迭代中都跳過了前面。它似乎將盡可能地接近效率。 – Nicole

回答

3

您可以使用正則表達式的偏移和拷貝一個數組,但它不會比strpos循環更快。

if (preg_match_all("/(match this string)/g",$string,$matches)) 
{ 
    echo $matches[0] ; // this is the whole string 
    echo $matches[1] ; // first match 
    echo $matches[2] ; // second match 
    echo $matches[3] ; // and so on 
} 

如果您想更換這些事件,請使用str_replace()。這樣你就不必擔心偏移。

+0

+1提到它不是更快。 – Nicole

2

您可以使用帶有PREG_OFFSET_CAPTURE標誌的preg_match(),以便捕獲所有匹配以及它們在源字符串中的位置。

preg_match('/your string/', $source, $matches, PREG_OFFSET_CAPTURE); 

$比賽將是包含匹配的字符串

+0

幾乎沒有任何可能的方式,這將比所討論的教程更好地執行。它當然看起來更好,儘管(儘管你可以將其他算法封裝在函數中)。 – Nicole

+0

對於這個特定的問題,正則表達式並不比提到的'strpos()'或'strstr()'方法好。 –

相關問題