Eliminar caracteres no numéricos (excepto puntos y comas) de una cadena


150

Si tengo los siguientes valores:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

¿Cómo puedo crear una nueva variable y establecerla en una copia de los datos que tengan caracteres no numéricos eliminados, con la excepción de comas y puntos? Los valores anteriores devolverían los siguientes resultados:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

Respuestas:


335

Puede usar preg_replace para intercambiar todos los caracteres no numéricos y la coma y punto / punto como sigue:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>

66
ver también php function money_function () ( php.net/manual/en/function.money-format.php )
horatio

55
[^ 0-9] coincidirá con cualquier carácter no numérico, por lo que no es necesario agregar la coma y el punto final. Esto es suficiente: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
billrichards

66
@billrichards No creo que sea correcto. Recuerde que quiere conservar la coma y el punto final, junto con los caracteres numéricos, no eliminarlos.
Richt222

1
@billrichards Como dijo el OP (el énfasis es mío), "evita los alfabetos o caracteres, excepto la coma y el punto ".
John Parker

¿Ese período no necesita una barra invertida? punto significa "cualquier personaje" ¿no?
Scott

66

Me sorprende no ha habido ninguna mención de filter_var aquí de esto es una vieja cuestión, tales ...

PHP tiene un método incorporado para hacer esto usando filtros de desinfección . Específicamente, el que se debe usar en esta situación es FILTER_SANITIZE_NUMBER_FLOATcon las FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDbanderas. Al igual que:

$numeric_filtered = filter_var("AR3,373.31", FILTER_SANITIZE_NUMBER_FLOAT,
    FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);
echo $numeric_filtered; // Will print "3,373.31"

También podría valer la pena tener en cuenta que debido a que está integrado en PHP, es un poco más rápido que usar expresiones regulares con las bibliotecas actuales de PHP (aunque literalmente en nanosegundos).


2
OMI, esta es la mejor respuesta.
Ogier Schelvis


4

Puede usar filter_varpara eliminar todos los caracteres ilegales, excepto los dígitos, el punto y la coma.

  • El FILTER_SANITIZE_NUMBER_FLOATfiltro se utiliza para eliminar todos los caracteres no numéricos de la cadena.
  • FILTER_FLAG_ALLOW_FRACTION está permitiendo separador de fracciones " . "
  • El propósito de FILTER_FLAG_ALLOW_THOUSANDobtener una coma de la cadena.

Código

$var1 = '12.322,11T';

echo filter_var($var1, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);

Salida

12.322,11

Para leer más sobre los filtros filter_var () y Sanitize


2

Si la solicitud es eliminar todo (y no solo uno) caracteres no numéricos, tal vez el anterior se pueda escribir de esta manera de una manera muy simple (pero podría escribir una función para pasar la cadena y hacer que devuelva el valor necesario sin caracteres) .. de todas formas..):

<?php
$String1 = 'AR3,373.31';
$String2 = '12.322,11T';

echo preg_replace('/[^0-9,.]+/i', '', $String1);
echo preg_replace('/[^0-9,.]+/i', '', $String2);
?>

1

Si las letras siempre están al principio o al final, simplemente puede usar recortar ... no se necesita expresión regular

$string = trim($string, "a..zA..Z"); // this also take care of lowercase

"AR3,373.31" --> "3,373.31"
"12.322,11T" --> "12.322,11"
"12.322,11"  --> "12.322,11"

Importante: Esto solo eliminará letras de la cadena. Otros caracteres, como espacios, corchetes, comillas, etc., se mantienen dentro del resultado. -> Solo use esta solución, si sabe que su cadena de entrada solo contiene letras y números, ¡y no otros caracteres!
Philipp

-1

Misma respuesta que middaparka pero elimine el,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);

No agregue los enlaces a su blog / sitio en las publicaciones. Eso podría considerarse como spam.
Tushar

Voto negativo: porque la respuesta de middaparka fue perfecta. El OP quiere mantener puntos y comas, pero su respuesta los elimina.
Carlos2W
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.