Extraer números de una cadena


332

Quiero extraer los números de una cadena que contiene números y letras como:

"In My Cart : 11 items"

Quiero aquí obtener el número 11o cualquier otro número.


Use este $ string = "En mi carrito: 11 artículos"; $ número = preg_replace ("/ [^ 0-9] {1,4} /", '', $ cadena); // regreso 11
Shorabh

Respuestas:


363
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);

2
¿Cómo puedo obtener mi número en una variable simple y no en Array?
Bizboss

34
$ var = implode ('', $ coincide [0]);
Gaurav

2
@Bizboss En una línea similar, inténtalo $newstr = preg_replace('!\d+!', '', $str);. Eliminará todos los dígitos de su cadena. Ejemplo: $str = 'In My Cart : 11 12 items';saldrá In My Cart : items.
Aether

77
Esto no es una forma amigable de recursos. use preg_replace("/[^0-9]/","",$string);orfilter_var($str, FILTER_SANITIZE_NUMBER_INT);
eapo

66
@eapo filter_var($str, FILTER_SANITIZE_NUMBER_INT);extrajo dígitos, signo más y menos . ¡La expresión regular solo extrajo dígitos!
PATROMO

537

Si solo quiere filtrar todo excepto los números, lo más fácil es usar filter_var :

$str = 'In My Cart : 11 items';
$int = (int) filter_var($str, FILTER_SANITIZE_NUMBER_INT);

56
Un guión antes de un número se tratará como un signo menos.
Elnur Abdurrakhimov

43
No solo antes del número. Cualquier +/- no se truncará. Si tienes xxx-yyy-24lo conseguirás --24. Puede usar str_repleace(array('+','-'), '', $result)para eliminar ambos signos.
imclickingmaniac

44
@imclickingmaniac simplemente puede hacerlo max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))utilizando matrices y reemplazos de cadenas.
Eduard

2
el uso de max () también devuelve el signo menos en las cadenas, la opción aquí es strreplace (). Gracias por los consejos.
Shiva Avula

26
abs((int) filter_var($str, FILTER_SANITIZE_NUMBER_INT));
MECU

300
preg_replace('/[^0-9]/', '', $string);

¡Esto debería hacer un mejor trabajo! ...


10
Me gusta esto porque devuelve una cadena, no una matriz como lo hacen los ejemplos con preg_match_all, y me gusta porque solo quiero números, no un signo más o guión, como lo hace el ejemplo filter_var.
Darrell Duane

43
Con éxito con este método: algo como 'En mi coche_Precio: 500.00imprimirá:50000
ErickBest

16
@ErickBest Eso es bueno, considerando que la pregunta era extract the numbers from a string: ¡un punto decimal no es un número!
rybo111

1
Este es un punto crítico, pero probablemente desee utilizar comillas simples 'y no comillas dobles ".
CommandZ

16
preg_replace ('/ [^ 0-9.] /', '', 'abc1.22'); // devuelve decimal 1.22
zzapper

84

Utilizando preg_replace:

$str = '(111) 111-1111';
$str = preg_replace('/\D/', '', $str);
echo $str;

Salida: 1111111111


44
Funciona muy bien Convierte +387 (61) 634-783cadena a 38761634783directamente. No tiene que ocuparse de matrices como la respuesta de Gaurav.
beytarovski

1
Definitivamente la mejor respuesta. sandbox.onlinephpfunctions.com/code/…
Steffan

Recomiendo el +cuantificador para que coincida con coincidencias más largas / menos reemplazos.
mickmackusa

21

Para números flotantes,

preg_match_all('!\d+\.?\d+!', $string ,$match);

Gracias por señalar el error. @mickmackusa


En realidad está mal :) Debería estarlo'!\d*.?\d+!'
Yash

Preferiría usarlo ?como cuantificador del punto literal. No esperaría que un valor flotante contenga múltiples símbolos de punto decimal. El patrón comentado de Yash es irónicamente incorrecto . El punto necesita una barra delante para hacerlo literal.
mickmackusa

11

No tengo el crédito por esto, pero solo tengo que compartirlo. Esta expresión regular obtendrá números de una cadena, incluidos puntos / lugares decimales, así como comas:

/((?:[0-9]+,)*[0-9]+(?:\.[0-9]+)?)/

Citado desde aquí:
php - regex - ¿cómo extraer un número con decimal (punto y coma) de una cadena (por ejemplo, 1,120.01)?


Esto no está validando la cadena para una coma entre conjuntos de tres números enteros. ... el problema de copiar y pegar el patrón de otra persona y no entenderlo / probarlo.
mickmackusa


9

Usando preg_replace

$str = 'In My Cart : 11 12 items';
$str = preg_replace('/\D/', '', $str);
echo $str;

Recomiendo el +cuantificador para que coincida con coincidencias más largas / menos reemplazos.
mickmackusa

6

Puede usar la siguiente función:

function extract_numbers($string)
{
   preg_match_all('/([\d]+)/', $string, $match);

   return $match[0];
}

No hay ningún beneficio en escribir \ddentro de una clase de caracteres. Como está accediendo a la coincidencia de cadena completa, no tiene sentido escribir un grupo de captura en el patrón.
mickmackusa

4
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);

El primer argumento en implosión en este caso específico dice "separe cada elemento en coincidencias [0] con un solo espacio". Implode no pondrá un espacio (o lo que sea su primer argumento) antes del primer número o después del último número.

Algo más a tener en cuenta es $ coincidencias [0] es donde se almacena la matriz de coincidencias (que coinciden con esta expresión regular) encontrada.

Para obtener más aclaraciones sobre para qué sirven los otros índices de la matriz, consulte: http://php.net/manual/en/function.preg-match-all.php



3
$value = '25%';

O

$value = '25.025$';

O

$value = 'I am numeric 25';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

Esto devolverá solo el valor numérico



3

Siga este paso, convertirá la cadena en número

$value = '$0025.123';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
settype($onlyNumeric,"float");

$result=($onlyNumeric+100);
echo $result;

Otra forma de hacerlo:

$res = preg_replace("/[^0-9.]/", "", "$15645623.095605659");

0

otra forma (cadena unicode incluso):

$res = array();
$str = 'test 1234 555 2.7 string ..... 2.2 3.3';
$str = preg_replace("/[^0-9\.]/", " ", $str);
$str = trim(preg_replace('/\s+/u', ' ', $str));
$arr = explode(' ', $str);
for ($i = 0; $i < count($arr); $i++) {
    if (is_numeric($arr[$i])) {
        $res[] = $arr[$i];
    }
}
print_r($res); //Array ( [0] => 1234 [1] => 555 [2] => 2.7 [3] => 2.2 [4] => 3.3 ) 

0

Este script crea un archivo al principio, escribe números en una línea y cambia a una línea siguiente si obtiene un carácter diferente al número. Finalmente, nuevamente ordena los números a una lista.

string1 = "hello my name 12 is after 198765436281094and14 and 124de"
f= open("created_file.txt","w+")
for a in string1:
    if a in ['1','2','3','4','5','6','7','8','9','0']:
        f.write(a)
    else:
        f.write("\n" +a+ "\n")
f.close()


#desired_numbers=[x for x in open("created_file.txt")]

#print(desired_numbers)

k=open("created_file.txt","r")
desired_numbers=[]
for x in k:
    l=x.rstrip()
    print(len(l))
    if len(l)==15:
        desired_numbers.append(l)


#desired_numbers=[x for x in k if len(x)==16]
print(desired_numbers)

-1

Dependiendo de su caso de uso, esto también podría ser una opción:

$str = 'In My Cart : 11 items';
$num = '';

for ($i = 0; $i < strlen($str); $i++) {

    if (is_numeric($str[$i])) {
        $num .= $str[$i];
    }
}

echo $num; // 11

Aunque estaría de acuerdo con una expresión regular o filter_var()sería más útil en el caso indicado.


-1

para utf8 str:

function unicodeStrDigits($str) {
    $arr = array();
    $sub = '';
    for ($i = 0; $i < strlen($str); $i++) { 
        if (is_numeric($str[$i])) {
            $sub .= $str[$i];
            continue;
        } else {
            if ($sub) {
                array_push($arr, $sub);
                $sub = '';
            }
        }
    }

    if ($sub) {
        array_push($arr, $sub); 
    }

    return $arr;
}

-1

Si no sabe de qué formato es el número? int o flotante, luego use esto:

$string = '$125.22';

$string2 = '$125';

preg_match_all('/(\d+.?\d+)/',$string,$matches); // $matches[1] = 125.22

preg_match_all('/(\d+.?\d+)/',$string2,$matches); // $matches[1] = 125

-1

Estas funciones también manejarán los números flotantes

$str = "Doughnuts, 4; doughnuts holes, 0.08; glue, 3.4";
$str = preg_replace('/[^0-9\.]/','-', $str);
$str = preg_replace('/(\-+)(\.\.+)/','-', $str);
$str = trim($str, '-');
$arr = explode('-', $str);

Introducir guiones en este proceso es completamente innecesario. Esta respuesta también carece de una explicación de cómo funciona y por qué cree que es una buena idea.
mickmackusa
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.