2012-06-28 11 views
8

Je cordes:Obtenir les numéros de chaîne avec 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)'; 

Comment puis-je trouver les chiffres numériques dans ces chaînes?

Peut-être avec la fonction:

function numbers($string){ 

    // ??? 

    $first = ?; 
    $second = ?; 
} 

Par exemple:

function numbers($one){ 

    // ??? 

    $first = 4; 
    $second = 5; 
} 

function numbers($two){ 

    // ??? 

    $first = 2; 
    $second = NULL; 
} 

Le meilleur moyen pour cela est peut-être regex, mais comment puis-je utiliser pour mon exemple? Peut-être sans regex?

+0

Vous voulez faire correspondre seulement les chiffres? De ne pas convertir 'one' en' 1'? – DaveRandom

+0

Votre question n'est pas claire, voulez-vous extraire uniquement des nombres d'une chaîne? – bodi0

+0

Jetez un oeil à ce ... il vous dirigera dans la direction ... http://stackoverflow.com/questions/1077600/converting-words-to-numbers-in-php – Brian

Répondre

22

Vous pouvez utiliser regular expressions pour cela. Le \descape sequence correspond à tous les chiffres de la chaîne de sujet.

Par exemple:

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

Vous pouvez faire:

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

Voilà ma tentative SANS une expression régulière

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

// Sortie:

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

'SANS une expression régulière' - Admirable, mais stupide pour ce travail. Regex sera beaucoup mieux/plus rapide ici - d'autant plus que vous appelez 'strlen()' à chaque itération plutôt que de mettre en cache dans une variable le résultat une fois avant la boucle. Essayez ceci avec une grosse corde (ou peut-être même une petite) et vous verrez que regex est beaucoup plus rapide. – DaveRandom

+0

Je suis d'accord c'est idiot, mais c'est ce que l'OP a demandé :) – Greg

+0

c'est super moyen, thanx man – Mevia

Questions connexes