2013-12-12 66 views
0

如何查找包含在字符串中的所有數字,除了那些在其中也有字母的數字(如A1)? 例如,在字符串「saddfs 2300 dfsfd 45 A3 A6」我只是想獲得2300和45PHP號碼子字符串

我知道

preg_match_all('!\d+!', $string, $nums); 

可以找到所有的數字,但我不想要查找的號碼從A3,A6也是。

謝謝!

回答

2

只需使用單詞邊界或字符串界限:

preg_match_all('!(^|\b)\d+(\b|$)!', $string, $nums); 

一些測試:

php > preg_match_all('!(^|\b)\d+(\b|$)!', 'saddfs 2300 dfsfd 45 A3 A6', $nums); 
php > print_r($nums[0]); 
Array 
(
    [0] => 2300 
    [1] => 45 
) 
php > preg_match_all('!(^|\b)\d+(\b|$)!', 'saddfs 2300 dfsfd 45 A3 A6 123', $nums); 
php > print_r($nums[0]); 
Array 
(
    [0] => 2300 
    [1] => 45 
    [2] => 123 
) 
php > preg_match_all('!(^|\b)[0-9]+(\b|$)!', '789 saddfs 2300 dfsfd 45 A3 A6 123', $nums); 
php > print_r($nums[0]); 
Array 
(
    [0] => 789 
    [1] => 2300 
    [2] => 45 
    [3] => 123 
) 

UPDATE:改變\d[0-9]每索爾特西拉吉的建議。

+0

順便說一下,您可能想用\ [0-9]替換\ d。 \ d還會查找中文,泰文和日文數字(總計超過1000個字符),並且在處理無效編碼的數據時,這些數字可能會繞過安全檢查並吹響數據庫。 –

+0

@ZsoltSzilagy好點。更新答案... –

2

非穩健,快速和骯髒的 - 和錯誤 - 解決方案:

$ php -a 
Interactive shell 

php > preg_match_all('/\W\d+\W/', 'saddfs 2300 dfsfd 45 A3 A6', $matches); 
php > print_r($matches); 
Array 
(
    [0] => Array 
     (
      [0] => 2300 
      [1] => 45 
     ) 

) 

更新每阿萊克斯摹建議,擺出陷阱此解決方案:

第一個問題:在嚴格的字符串開始或結束時,這不符合純數字。要做到這一點,請按照阿萊克斯G花紋,這使錨文字捕捉子模式:

preg_match_all('/(^|\W)\d+(\W|$)/', '2300 df A6 242 sfd 45', $matches); 

你可以使圖形非捕獲('/(?:^|\W)\d+(?:\W|$)/'),以顯示你的意圖是,括號裏的分組,而不是捕捉 - 但這純粹是可選的,因爲您仍然想要的值仍保留在$matches[0]

第二個問題:\ b和\ W並不完全相同。 \ b是「單詞邊界」,而\ W是「不是單詞字符」。比較Aleks G的結果和我的答案,你會看到\ b給出純數字,而\ W給出周圍空間。

更新 Per Zsolt Szilagy評論\ d匹配當前字符集中的數字,因此對於具有更多數字字符的語言(例如中文),您將無法獲得0到9的期望值。爲此,使用字符類[0-9]。

+0

這對於字符串開頭或結尾的數字不起作用。用字符串''saddfs 2300 dfsfd 45 A3 A6 123''測試你的代碼 - 最後一個'123'不會被匹配。 –

+0

@AleksG:我知道這一點。讀者需要確定一些東西。 – bishop

+0

如果您意識到這一點並有意將其留給OP來確定,您應該在答案中明確說明。否則,它會出現sl or或懶惰。 –