2012-06-28 48 views
8

我有一個字符串:獲得來自串號與PHP

$one = 'foo bar 4 baz (5 qux quux)'; 
$two = 'bar baz 2 bar'; 
$three = 'qux bar 12 quux (3 foo)'; 
$four = 'foo baz 3 bar (13 quux foo)'; 

我怎樣才能找到這些字符串幾個數字?

也許與功能:

function numbers($string){ 

    // ??? 

    $first = ?; 
    $second = ?; 
} 

例如:

function numbers($one){ 

    // ??? 

    $first = 4; 
    $second = 5; 
} 

function numbers($two){ 

    // ??? 

    $first = 2; 
    $second = NULL; 
} 

關於這個問題最好的方法也許是正則表達式,但我該如何使用這個對我的例子嗎?也許沒有正則表達式?

+0

你只想匹配數字?不要把'one'轉換成'1'? – DaveRandom

+0

你的問題不清楚,你想從字符串中只提取數字嗎? – bodi0

+0

看看這個...它會指向你的方向... http://stackoverflow.com/questions/1077600/converting-words-to-numbers-in-php – Brian

回答

22

您可以使用regular expressions這一點。 \descape sequence將匹配主題字符串中的所有數字。

例如:

<?php 

function get_numerics ($str) { 
    preg_match_all('/\d+/', $str, $matches); 
    return $matches[0]; 
} 

$one = 'foo bar 4 baz (5 qux quux)'; 
$two = 'bar baz 2 bar'; 
$three = 'qux bar 12 quux (3 foo)'; 
$four = 'foo baz 3 bar (13 quux foo)'; 

print_r(get_numerics($one)); 
print_r(get_numerics($two)); 
print_r(get_numerics($three)); 
print_r(get_numerics($four)); 

https://3v4l.org/DiDBL

6

你可以這樣做:

$str = 'string that contains numbers'; 
preg_match_all('!\d+!', $str, $matches); 
print_r($matches); 
5

這是我嘗試正則表達式

function getNumbers($str) { 
    $result = array(); 

    // Check each character. 
    for($i = 0, $len = strlen($str); $i < $len; $i++) { 
     if(is_numeric($str[$i])) { 
      $result[] = $str[$i]; 
     } 
    } 

    return $result; 
} 

$one = 'one two 4 three (5 four five)'; 
$two = 'one two 2 three'; 
$three = 'one two 12 three (3 four)'; 
$four = 'one two 3 three (13 four five)'; 

var_dump(getNumbers($one)); 
var_dump(getNumbers($two)); 
var_dump(getNumbers($three)); 
var_dump(getNumbers($four)); 

//輸出:

array(2) { 
    [0]=> 
    string(1) "4" 
    [1]=> 
    string(1) "5" 
} 

array(1) { 
    [0]=> 
    string(1) "2" 
} 

array(3) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(1) "3" 
} 

array(3) { 
    [0]=> 
    string(1) "3" 
    [1]=> 
    string(1) "1" 
    [2]=> 
    string(1) "3" 
} 
+1

「沒有正則表達式」 - 令人欽佩,但對於這份工作很愚蠢。正則表達式在這裏會更好/更快 - 尤其是因爲您在每次迭代時調用'strlen()',而不是在循環之前將結果緩存到變量中。嘗試使用大字符串(或者甚至是小字符串),你會發現正則表達式要快得多。 – DaveRandom

+0

我同意這是愚蠢的,但這是OP要求:) – Greg

+0

這是超級方式,thanx人 – Mevia