Remover caracteres não numéricos (exceto pontos e vírgulas) de uma sequência

150

Se eu tiver os seguintes valores:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

Como posso criar uma nova variável e configurá-la para uma cópia dos dados que possuem caracteres não numéricos removidos, com exceção de vírgulas e pontos? Os valores acima retornariam os seguintes resultados:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11
user485783
fonte

Respostas:

335

Você pode usar preg_replace para trocar todos os caracteres não numéricos e vírgula e ponto / ponto final da seguinte maneira:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>
John Parker
fonte
6
ver também a função php money_function () ( php.net/manual/en/function.money-format.php )
horatio
5
[^ 0-9] corresponderá a qualquer caractere não numérico; portanto, não é necessário adicionar vírgula e ponto final. Isso é suficiente: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
billrichards
6
@ billrichards Eu não acho que isso é correto. Lembre-se de que ele deseja reter a vírgula e o ponto final, juntamente com os caracteres numéricos, não removê-los.
Richt222
1
@billrichards Como o OP afirmou (ênfase minha), "evite alfabetos ou caracteres, exceto vírgula e ponto ".
John Parker
esse período não precisa de uma barra invertida? período significa "qualquer personagem", não é?
Scott Scott
66

Estou surpreso que não tenha havido menção a filter_var aqui por ser uma pergunta tão antiga ...

O PHP tem um método embutido de fazer isso usando filtros de higienização . Especificamente, aquele a ser usado nessa situação é FILTER_SANITIZE_NUMBER_FLOATcom os FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDsinalizadores. Igual a:

$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"

Também pode valer a pena notar que, como é embutido no PHP, é um pouco mais rápido do que usar o regex com as bibliotecas atuais do PHP (embora literalmente em nanossegundos).

Bryan Way
fonte
2
IMO, esta é a melhor resposta.
Ogier Schelvis
30

Maneira mais simples de remover verdadeiramente todos os caracteres não numéricos:

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

\D representa "qualquer caractere que não seja um dígito decimal"

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

mopo922
fonte
Esta é de resposta muito mais agradável :)
baron_bartek
4

Você pode usar filter_varpara remover todos os caracteres ilegais, exceto dígitos, pontos e vírgula.

  • O FILTER_SANITIZE_NUMBER_FLOATfiltro é usado para remover todos os caracteres não numéricos da sequência.
  • FILTER_FLAG_ALLOW_FRACTION está permitindo separador de frações " . "
  • O objetivo de FILTER_FLAG_ALLOW_THOUSANDobter vírgula da string.

Código

$var1 = '12.322,11T';

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

Resultado

12.322,11

Para ler mais sobre os filtros filter_var () e Sanitize

Adeel
fonte
2

Se a solicitação for remover todos os caracteres não numéricos (e não apenas um), talvez o anterior possa ser escrito dessa maneira de uma maneira muito simples (mas você pode escrever uma função para passar a string e fazer com que ela retorne o valor necessário sem caracteres) .. de qualquer forma..):

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

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

Se as letras estão sempre no começo ou no final, você pode simplesmente usar o recorte ... não é necessário regex

$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"
Andrew
fonte
Importante: Isso removerá apenas as letras da sequência. Outros caracteres, como espaços, colchetes, aspas, etc. são mantidos dentro do resultado. -> Utilize esta solução apenas se souber que a sua sequência de entrada contém apenas letras e números e nenhum outro caractere!
Philipp
-1

Mesma resposta que middaparka, mas remova o,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);
jonasdev
fonte
Por favor, não adicione os links para o seu blog / site nas postagens. Isso pode ser considerado como spam.
Tushar
Voto a favor: Porque a resposta de middaparka foi perfeita. O OP deseja manter pontos e vírgulas, mas sua resposta os remove.
Carlos2W