2011-03-10 61 views
0

我有制度,即使用關鍵字,通過一些數據PHP約定

有正常的關鍵字和META關鍵字 - 爲:所有,Tomember:和Togroup:

和我有以下條件檢查元關鍵字:

if ((strpos($kwd, 'To:all') === 0) || 
    (strpos($kwd, 'Tomember:') === 0) || 
    (strpos($kwd, 'Togroup:') === 0)) 
{ 
    /* ... */ 
} 

我認爲這種識別元關鍵字的方法不正確。

還有一個不正確的方法是這樣的:

if ((strpos($kwd, 'To:all') !== FALSE) || 
    (strpos($kwd, 'Tomember:') !== FALSE) || 
    (strpos($kwd, 'Togroup:') !== FALSE)) 
{ 
    /* ... */ 
} 

而且在我看來,正確的做法是:

if ((substr($kwd,0,6) == 'To:all') || 
    (substr($kwd,0,9) == 'Tomember:') || 
    (substr($kwd,0,8) == 'Togroup:')) 
{ 
    /* ... */ 
} 

有什麼想法?

回答

2

在您提出的解決方案中,第二個是錯誤的,因爲即使元關鍵字未出現在$kwd的開頭,它也會返回true。其他兩個正常工作。

一個更好的方法是:

function str_starts_with($haystack, $needle) { 
    return substr($haystack, 0, strlen($needle)) == $needle; 
} 

if (str_starts_with($kwd, 'To:all') || 
    str_starts_with($kwd, 'Tomember:') || 
    str_starts_with($kwd, 'Togroup:')) 
{ 
    // ... 
} 
+0

是的,這就是我的意思 – llamerr 2011-03-10 11:56:11

+2

'strncmp($ needle,$ haystack,strlen($ needle))=== 0'。根據手冊中的一些意見,其速度大約快20%。 – KingCrunch 2011-03-10 11:57:24

+1

@KingCrunch:謝謝你指出。但是,我們不要爲這裏的樹木失去森林:我們不知道它是否會對手頭的問題產生影響(可能不會),更重要的是,我們不知道「互聯網上的某個人」是如何基準的。 – Jon 2011-03-10 12:01:09

1
strpos($kwd, 'To:all') === 0 

將檢查$kwd開始To:all - 它會檢查的To:all$kwd位置爲0


strpos($kwd, 'To:all') !== FALSE 

將檢查$kwd字符串包含To:all - 無論如何在哪個位置。


substr($kwd,0,6) == 'To:all' 

whill檢查的$kwd前6個字符是To:all - 這相當於第一溶液。


如果你想測試開始情況下,您將使用第一或第三的解決方案。 Personnaly,我會去strpos-based:我覺得更容易閱讀/理解;但主要是個人喜好的問題。

如果要測試包含的情況,則需要使用第二種解決方案。

+0

是的,我要檢查_begins WITH_情況下,我想收集一些統計數據 - 對我來說第三種情況是更具可讀性 – llamerr 2011-03-10 12:02:22