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

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);
?>
John Parker
fuente
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).

Bryan Way
fuente
2
OMI, esta es la mejor respuesta.
Ogier Schelvis
30

La forma más simple de eliminar verdaderamente todos los caracteres no numéricos:

echo preg_replace('/\D/', '', $string);

\D representa "cualquier carácter que no sea un dígito decimal"

http://php.net/manual/en/regexp.reference.escape.php

mopo922
fuente
Esto es, con mucho, mejor respuesta :)
baron_bartek
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

Adeel
fuente
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);
?>
andymnc
fuente
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"
Andrés
fuente
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);
jonasdev
fuente
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