2012-06-28 31 views
8

Tôi có chuỗi:Nhận số từ chuỗi với 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)'; 

Làm thế nào tôi có thể tìm thấy các chữ số số trong những chuỗi?

Có lẽ với chức năng:

function numbers($string){ 

    // ??? 

    $first = ?; 
    $second = ?; 
} 

Ví dụ:

function numbers($one){ 

    // ??? 

    $first = 4; 
    $second = 5; 
} 

function numbers($two){ 

    // ??? 

    $first = 2; 
    $second = NULL; 
} 

Cách tốt nhất cho điều này có lẽ là regex, nhưng làm thế nào tôi có thể sử dụng ví dụ của tôi? Có lẽ không có regex?

+0

Bạn chỉ muốn đối sánh số học? Không chuyển đổi 'một' thành' 1'? – DaveRandom

+0

Câu hỏi của bạn không rõ ràng, bạn có muốn trích xuất chỉ các số từ một chuỗi không? – bodi0

+0

Hãy xem xét điều này ... nó sẽ chỉ cho bạn hướng ... http://stackoverflow.com/questions/1077600/converting-words-to-numbers-in-php – Brian

Trả lời

22

Bạn có thể sử dụng regular expressions cho việc này. \descape sequence sẽ khớp với tất cả các chữ số trong chuỗi chủ đề.

Ví dụ:

<?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

Bạn có thể làm:

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

Đây là nỗ lực của tôi KHÔNG một biểu thức chính quy

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)); 

// Output:

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

'KHÔNG CÓ một biểu thức chính quy' - Đáng ngưỡng mộ, nhưng ngớ ngẩn cho công việc này. Regex sẽ tốt hơn nhiều/nhanh hơn ở đây - đặc biệt là kể từ khi bạn đang gọi 'strlen()' trên mỗi lần lặp thay vì bộ nhớ đệm trong một biến kết quả một lần trước vòng lặp. Hãy thử điều này với một chuỗi lớn (hoặc thậm chí có thể là một chuỗi nhỏ) và bạn sẽ thấy regex nhanh hơn nhiều. – DaveRandom

+0

Tôi đồng ý điều này là ngớ ngẩn, nhưng đó là những gì OP yêu cầu cho :) – Greg

+0

đó là cách siêu, thanx người đàn ông – Mevia