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.

Bizboss
fuente
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);
Gaurav
fuente
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);
Daniel Bøndergaard
fuente
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! ...

Mahipalsinh Ravalji
fuente
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

Akash Deep
fuente
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

Yash
fuente
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)?

mroncetwice
fuente
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

Puedes usar preg_match :

$s = "In My Cart : 11 items";
preg_match("|\d+|", $s, $m);
var_dump($m);
Dmitri Gudkov
fuente
echo '<p>'.$m[0].'</p>';
Pathros
9

Usando preg_replace

$str = 'In My Cart : 11 12 items';
$str = preg_replace('/\D/', '', $str);
echo $str;
Hariadi
fuente
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];
}
Jasmeen
fuente
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

Bradley Kovacs
fuente
4

prueba esto, usa preg_replace

$string = "Hello! 123 test this? 456. done? 100%";
$int = intval(preg_replace('/[^0-9]+/', '', $string), 10);
echo $int;

MANIFESTACIÓN

Dave
fuente
[^0-9]se escribe más simplemente como \D.
mickmackusa
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

Rakesh
fuente
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");
jewelhuq
fuente
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 ) 
Mehrdad
fuente
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)
Abhishek Poudel
fuente
-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.

kasimir
fuente
-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;
}
Mehrdad
fuente
-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
Sajjad Hossain Sagor
fuente
-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);
Khaldoon Masud
fuente
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