2012-07-20 63 views
3

可能重複:
a simple function for return number from string in phpPHP:最好的方法來從字符串中提取數字

什麼是最好/最有效的方法來從字符串中提取一組特定的數字?例如:我希望在案例#之後立即得到一組數字,在sring「blah blah Case#004522 blah blah」中。我想像例子#之後的數字字符總是一樣的,但我希望代碼不要像以前那樣做這個假設。

到目前爲止,我一直在使用strpos方法來定位案例#再拉個字符的具體數目後記使用SUBSTR。我只是覺得這很笨重。也許preg_match會更有效或簡化?

$text = "blah blah Case#004552 blah blah"; 
$find = strpos($text,'Case#'); 
if ($find) 
    $numbers = substr($text, $find+5, 6); 
+1

'的preg_match('/ \ d + /',$ str,$ match);' - '$ match [0]'將包含字符串中的第一個連續數字組。 – DaveRandom 2012-07-20 14:19:55

+0

取決於您對「最佳」的定義。你的意思是最快嗎?我認爲strpos應該是在另一個字符串中查找特定字符串的最快方法,假設將該數字視爲以字符串開頭(比preg_match快)。 – Rhys 2012-07-20 14:23:39

+0

@Ryven:最佳在該特定情況下是用的preg_match作爲陣列中獲得可能的多個匹配被一個未考慮獎金。 – Brad 2012-07-20 14:34:55

回答

6

您可以使用正則表達式來首先匹配你的角色(Case#)的圖案,然後您希望匹配的數字只(位),也就是在PCRE \dDemo):

$numbers = preg_match("/Case#(\d+)/", $text, $matches) 
       ? (int)$matches[1] 
       : NULL 
    ; 
unset($matches); 

對於多個(整數)相匹配一次:

$numbers = preg_match_all("/Case#(\d+)/", $text, $matches) 
       ? array_map('intval', $matches[1]) 
       : NULL 
    ; 
unset($matches); 
+0

你不需要'[\ d]'中的'[]''。 – nickb 2012-07-20 14:20:05

+0

是的。固定。謝謝。 – madfriend 2012-07-20 14:21:09

+0

該會發出通告,如果正則表達式不匹配 – 2012-07-20 14:24:32

3

你可以找到它,你做它已經,然後掃描數(Demo):

$find = strpos($text, 'Case#'); 
sscanf(substr($text, $find), 'Case#%d', $numbers); 
+0

這也適用,它非常簡單。我更喜歡preg_match的例子的唯一原因是,它返回可能的多個匹配,直到我看到它,沒有意識到可以實際發生在我們的場景中。謝謝! – Brad 2012-07-20 14:30:23

+1

是的,如果模式更一般,並且有重複,'preg_match_all'是一個不錯的選擇。我編輯了另一個答案,並用'preg_match_all'添加了一個例子。 – hakre 2012-07-20 14:33:44

0

最簡單的辦法是

if (preg_match('/Case#\s*(\d+)/i', $test, $m)) { 
    $numbers = $m[1]; 
}