2012-06-14 51 views
1

我試圖計算字符串是否以字符US,DS,UCS或DCS開頭。PHP - 使用多個通配符搜索字符串

由於誘人,因爲它只是做了不必要的長時間if語句,我想有一個更好的辦法,我一直在努力執行該使用正則表達式,但有沒有喜悅:

$string = 'USQWERTY'; 
if(preg_match_all('|(US|DS|UCS|DCS)|', $string) // do something 

它總是返回false,我想知道是否因爲我沒有使用通配符?我已經嘗試過在每個單詞之後使用* s,但不幸的是沒有任何喜悅。

真的很感激任何意見,謝謝!

回答

5

首先,你真的不需要preg_match_all,如果你想要的是一個匹配。 preg_match就夠了。其次,如果使用管道符號作爲全局模式分隔符,則必須在模式本身內將其轉義。只是選擇通常的正斜槓符號更容易。)

最後,如果你需要匹配,只有當字符串開頭(同系列的字母),你就必須稍微改變正則表達式:

if (preg_match('/^(?:US|DS|UCS|DCS)/', $string)) { ... } 

對我的作品在這個例子中:

<?php 

$string = 'USdsa'; 
if (preg_match('/^(?:US|DS|UCS|DCS)/', $string)) { 
    echo 'Matched!'; 
} 

$string = 'DCSda'; 
if (preg_match('/^(?:US|DS|UCS|DCS)/', $string)) { 
    echo 'Matched again!'; 
} 

$string = 'EWDS'; 
if (! preg_match('/^(?:US|DS|UCS|DCS)/', $string)) { 
    echo 'Not matched!'; 
} 

?> 
+0

非常感謝,很多偉大的答案在這裏,但我會把這個標記爲正確的答案,因爲你注意到我愚蠢地使用了錯誤的preg_match函數!謝謝:) – Nick

6

你應該使用不同的delimiter

'/(US|DS|UCS|DCS)/' 

我也注意到你這樣說:

我試圖用推測,如果一個字符串開始字符美國,DS, UCS或DCS。

正在使用的正則表達式將匹配字符串中任何位置的那些字符。你也應該在字符串的開頭使用字符串錨的開始,只匹配:

'/^(US|DS|UCS|DCS)/' 

您還缺少一個右括號,它看起來像你想使用preg_match,而不是preg_match_all

if (preg_match('/^(US|DS|UCS|DCS)/', $string)) 
+0

謝謝你,它似乎總是返回false不過,即使我更改以匹配整個事情:preg_match_all( '/ ^(USQWERTY | DS | UCS | DCS)/',$字符串) – Nick

+0

我是一個白癡,對不起 - 我只是意識到preg_match_all匹配所有這些,而不是單獨檢查所有這些匹配! – Nick

+0

@尼克:我不認爲你是個白癡。我想你只是沒有閱讀[PHP手冊](http://php.net/manual/en/index.php)。可能是因爲你不知道它存在。我建議你閱讀它,或者如果你沒有時間閱讀它,至少每次卡住時都要使用它作爲參考。 –

1

管路裝置OR,所以你需要從一開始和結尾處,刪除這一點,也確保其不區分大小寫

/^(US|DS|UCS|DCS)/gi 
+0

g是全球性的,我不區分大小寫。 –

+0

此外,你可以在這裏測試你的正則表達式:http://gskinner.com/RegExr/ –

1

你的問題是:PCRE patterns need to be enclosed within delimiters,如果你要包括在您的分隔符該模式,你需要逃避它。

所以,如果你改變你的正則表達式來執行下列操作之一,它應該工作:

  • '/(US|DS|UCS|DCS)/'
  • '|(US\|DS\|UCS\|DCS)|'

雖然我強烈建議第一種形式,因爲它是combersome在正則表達式中使用具有許多含義的符號作爲PCRE分隔符。

1

我不是正則表達式的專家,主要是因爲它只是混淆了我的beejeebus。我寫了這個功能非常快,可以檢查你。

function searchMultiple($n, $h) { 
    for ($i = 0; $i < count($n); $i++) { 
     if (stripos($h, $n[$i]) !== false) return TRUE; 
    } 
    } 

    $needles = array("US","DS","UCS","DCS"); 
    $haystack = "We are looking for one of our needles in here, like maybe 'US'"; 
    searchMultiple($needles, $haystack); 
+0

這是一個有趣的方法,謝謝! – Nick