2011-01-29 12 views
11

asumiendo que tengo estos textos 'x34', '150px', '650dpi', 'e3r4t5' ... ¿cómo puedo obtener solo números? Quiero decir que quiero 34, 150, 650, 345 sin ningún otro personaje. quiero decir obtener los números que tiene esta cadena en una variable.Filtrar números en una cadena en php

Respuesta

13

Lo siento por unirse al carro tarde, en lugar de utilizar expresiones regulares, sugeriría que utilice PHP de funciones integradas, que puede ser más rápido que la expresión regular .

filter_var

flags for the filters

por ejemplo para obtener sólo los números de la cadena dada

<?php 
$a = '[email protected]+dk9.0$3e8`~]\]2'; 
$number = str_replace(['+', '-'], '', filter_var($a, FILTER_SANITIZE_NUMBER_INT)); 
// Output is 390382 
?> 

Para cumplir con las normas más estrictas para su pregunta, he actualizado mi respuesta para dar un mejor resultado.

he añadido str_replace, como FILTER_SANITIZE_NUMBER_FLOAT o INT bandera no se tira + y - caracteres de la cadena, porque son parte de la regla de excepción de PHP.

Aunque ha hecho que el filtro sea un poco largo, pero ahora tiene menos posibilidades de fallar o darle resultados inesperados, y esto será más rápido que REGEX.

Editar:

1: dado cuenta de que con FILTER_SANITIZE_NUMBER_FLOAT, PHP no elimina los siguientes caracteres opcionalmente.,eE, por lo tanto, para obtener números apenas puros utilizan amablemente FILTER_SANITIZE_NUMBER_INT

2: Si tiene una versión de PHP menor que 5.4, utilice amablemente array('+', '-') en lugar de la sintaxis de matriz corta ['+', '-'].

11

Se puede utilizar una expresión regular para eliminar cualquier carácter que no sea un dígito:

preg_replace('/\D/', '', $str) 

Aquí el patrón \D describe cualquier carácter que no sea un dígito (a complementar \d).

19
$str = "e3r4t5"; 
$str_numbers_only = preg_replace("/[^\d]/", "", $str); 

// $number = (int) $str; 
+1

Exactamente. http://ideone.com/WKtth –

+0

por qué no utilizar las funciones de filtro PHP a partir de ahora, lo cual es recomendable. Encuentre mi respuesta debajo de – Haijerome

2

Reemplace todo lo que no sea un número y use ese valor.

$str = "foo1bar2baz3"; 
$num = intval(preg_replace("/[^0-9]/", "", $str)); 
+0

Supongo que la respuesta anterior es más eficiente, considerando el uso en millones de entidades. –

6

Utilice las funciones de PHP FILTER si está utilizando PHP 5.2.X, 5.3.x, 5.4. Su muy recomendable

$mixed_input = "e3r4t5"; 
$only_numbers = filter_var($mixed_input, FILTER_SANITIZE_NUMBER_INT); 

favor seguir adelante con this link saber más

+1

Acepto que esto se recomienda. Sin embargo, no podría funcionar como se espera si mixed_input contiene signos '+' o '-', ya que estos no se filtran, incluso en el medio de la cadena. – Julien

1

Puede utilizar la función siguiente

extract_numbers de función ($ cadena) {

preg_match_all ('/ ([\ d] +) /', $ cadena, $ partido);

return $ match;

}

+0

Funciona para mí :) – Jasmeen

Cuestiones relacionadas