有strpos()查找第一個匹配項,strrpos()查找最後一個匹配項。PHP:如何使用stripos查找(用戶定義的)字符串的位置
This教程解釋說有可能使用循環獲得任何發生,但當乾草堆很大時可能不會很快。而我的代碼現在看起來很醜陋。
有沒有找到第二,第三,第四等發生沒有循環乾草堆?我的意思是,直接找到所需的事件而無需循環?可能?
有strpos()查找第一個匹配項,strrpos()查找最後一個匹配項。PHP:如何使用stripos查找(用戶定義的)字符串的位置
This教程解釋說有可能使用循環獲得任何發生,但當乾草堆很大時可能不會很快。而我的代碼現在看起來很醜陋。
有沒有找到第二,第三,第四等發生沒有循環乾草堆?我的意思是,直接找到所需的事件而無需循環?可能?
您可以使用正則表達式的偏移和拷貝一個數組,但它不會比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()
。這樣你就不必擔心偏移。
+1提到它不是更快。 – Nicole
您可以使用帶有PREG_OFFSET_CAPTURE標誌的preg_match()
,以便捕獲所有匹配以及它們在源字符串中的位置。
preg_match('/your string/', $source, $matches, PREG_OFFSET_CAPTURE);
$比賽將是包含匹配的字符串
幾乎沒有任何可能的方式,這將比所討論的教程更好地執行。它當然看起來更好,儘管(儘管你可以將其他算法封裝在函數中)。 – Nicole
對於這個特定的問題,正則表達式並不比提到的'strpos()'或'strstr()'方法好。 –
你不能。即使沒有循環,你調用的函數(比如'findall()')最終會使用循環。 –
@eyazici我的意思是,我只想找到一個特定的事件,讓我們說只有第四次發生,如果我只想要第四次發生,我必須使用循環嗎? – evilReiko
如果沒有訪問每個位置至少一次,程序就無法知道字符串中包含的內容,因此,如果沒有某種索引,無論它是代碼中的循環還是內置函數,都必須訪問每個角色。你想擔心的是** N^2 **循環或更糟。本教程中的示例並不是那麼糟糕,因爲它在循環的每個下一次迭代中都跳過了前面。它似乎將盡可能地接近效率。 – Nicole