2012-06-28 14 views
8

I Strings haben:Holen Zahlen von Zeichenfolge mit 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)'; 

Wie kann ich die Ziffern in dieser Zeichenfolgen finden?

Vielleicht mit Funktion:

function numbers($string){ 

    // ??? 

    $first = ?; 
    $second = ?; 
} 

Zum Beispiel:

function numbers($one){ 

    // ??? 

    $first = 4; 
    $second = 5; 
} 

function numbers($two){ 

    // ??? 

    $first = 2; 
    $second = NULL; 
} 

Der beste Weg, dies vielleicht regex ist, aber wie kann ich das für mein Beispiel? Vielleicht ohne Regex?

+0

Sie möchten nur Zahlenwerte abgleichen? Nicht auch "eins" in "1" umwandeln? – DaveRandom

+0

Ihre Frage ist nicht klar, möchten Sie nur Zahlen aus einer Zeichenfolge extrahieren? Haben – bodi0

+0

einen Blick auf diese ... es wird Ihnen in Richtung zeigen ... http://stackoverflow.com/questions/1077600/converting-words-to-numbers-in-php – Brian

Antwort

22

Sie regular expressions dafür verwenden können. Die \descape sequence wird alle Ziffern in der Betreffzeile übereinstimmen.

Zum Beispiel:

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

Sie tun können:

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

Hier ist mein Versuch OHNE einen regulären Ausdruck

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

// Ausgabe:

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

'OHNE einen regulären Ausdruck' - Bewundernswert, aber albern für diesen Job. Regex wird hier viel besser/schneller sein - besonders, da Sie 'strlen()' bei jeder Iteration aufrufen, anstatt das Ergebnis vor der Schleife in einer Variablen zwischenzuspeichern. Versuchen Sie dies mit einer großen Zeichenfolge (oder vielleicht sogar einer kleinen) und Sie werden finden, dass Regex viel schneller ist. – DaveRandom

+0

Ich stimme zu, das ist albern, aber es ist was OP gefragt :) – Greg

+0

das ist super Weg, danke Mann – Mevia

Verwandte Themen