2012-06-28 24 views
8

tengo cadenas:Obtener los números de cadena con 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)'; 

¿Cómo puedo encontrar los dígitos numéricos en estas cadenas?

Tal vez con la función:

function numbers($string){ 

    // ??? 

    $first = ?; 
    $second = ?; 
} 

Por ejemplo:

function numbers($one){ 

    // ??? 

    $first = 4; 
    $second = 5; 
} 

function numbers($two){ 

    // ??? 

    $first = 2; 
    $second = NULL; 
} 

mejor manera para que esto quizás es la expresión regular, pero ¿cómo puedo usar esto para mi ejemplo? Tal vez sin expresiones regulares?

+0

¿Quiere hacer coincidir solo los números? ¿No convertir 'one' a' 1' también? – DaveRandom

+0

Su pregunta no está clara, ¿desea extraer solo números de una cadena? – bodi0

+0

Tener un vistazo a esto ... que le apuntan en la dirección ... http://stackoverflow.com/questions/1077600/converting-words-to-numbers-in-php – Brian

Respuesta

22

Puede utilizar regular expressions para esto. El \descape sequence coincidirá con todos los dígitos en la cadena de asunto.

Por ejemplo:

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

que puede hacer:

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

Aquí está mi intento SIN una expresión regular

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

// Salida:

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

'SIN una expresión regular '- Admirable, pero tonto para este trabajo. Regex será mucho mejor/más rápido aquí, especialmente dado que está llamando 'strlen()' en cada iteración en lugar de almacenar en caché en una variable el resultado una vez antes del ciclo. Pruebe esto con una cadena grande (o tal vez incluso una pequeña) y encontrará que la expresión regular es mucho más rápida. – DaveRandom

+0

Estoy de acuerdo que esto es una tontería, pero es lo que OP pidió :) – Greg

+0

que es súper, hombre de thanx – Mevia

Cuestiones relacionadas