Como posso obter meu número em uma variável simples e não em Array?
Bizboss
34
$ var = implode ('', $ corresponde a [0]);
Gaurav
2
@ Bizboss Em uma linha semelhante, tente $newstr = preg_replace('!\d+!', '', $str);. Ele removerá todos os dígitos da sua string. Exemplo: $str = 'In My Cart : 11 12 items';será exibido In My Cart : items.
Aether
77
Esta não é uma maneira amigável de recursos. use preg_replace("/[^0-9]/","",$string);orfilter_var($str, FILTER_SANITIZE_NUMBER_INT);
eapo
6
@eapo filter_var($str, FILTER_SANITIZE_NUMBER_INT);dígitos extraídos, sinal de mais e menos . O regex extraiu apenas dígitos!
PATROMO
537
Se você deseja filtrar tudo, exceto os números, o mais fácil é usar o filter_var :
Um traço antes de um número será tratado como um sinal de menos.
Elnur Abdurrakhimov 19/11
43
Não apenas antes do número. Qualquer +/- não será truncado. Se você tiver, xxx-yyy-24você receberá --24. Você pode usar str_repleace(array('+','-'), '', $result)para excluir os dois sinais.
imclickingmaniac 8/13
4
@imclickingmaniac, você pode simplesmente max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))usar matrizes e substituições de strings.
Eduard
2
usando max () também está retornando o sinal de menos nas strings, espero que strreplace () seja a opção aqui. Obrigado por dicas.
Eu gosto disso porque retorna uma string, não uma matriz como os exemplos com preg_match_all do, e gosto porque só quero números, não um sinal de adição ou traço, como o exemplo filter_var.
Darrell Duane
43
Seja cuidadoso com este método: algo como 'In My Car_Price: 500.00será impresso:50000
ErickBest
16
@ ErickBest Isso é uma coisa boa, considerando que a pergunta era extract the numbers from a string- um ponto decimal não é um número!
Rybo111
1
Este é um resumo, mas você provavelmente deseja usar aspas simples 'e não aspas duplas ".
Está funcionando muito bem. Ele converte a +387 (61) 634-783string 38761634783diretamente. Você não precisa cuidar de matrizes como a resposta de Gaurav.
Eu preferiria usar ?como quantificador do ponto literal. Eu não esperaria que um valor flutuante contivesse vários símbolos de ponto decimal. O padrão comentado de Yash está errado ironicamente. O ponto precisa de uma barra na frente para torná-lo literal.
mickmackusa 19/02
11
Eu não possuo o crédito por isso, mas só tenho que compartilhá-lo. Essa regex obterá números de uma sequência, incluindo pontos decimais / casas, além de vírgulas:
Isso não está validando a sequência de vírgulas entre conjuntos de três números inteiros. ... o problema de copiar e colar o padrão de outra pessoa e não o entender / testar.
Não há nenhum benefício em escrever \ddentro de uma classe de personagem. Como você está acessando a correspondência de cadeia completa, não faz sentido gravar um grupo de captura no padrão.
O primeiro argumento em implode neste caso específico diz "separe cada elemento em correspondências [0] com um único espaço". Implode não colocará um espaço (ou seja qual for o seu primeiro argumento) antes do primeiro número ou após o último número.
Outra coisa a notar é $ correspondências [0] é onde a matriz de correspondências (que correspondem a essa expressão regular) encontrada é armazenada.
$string ='In My Car_Price : 50660.00';
echo intval(preg_replace('/[^0-9.]/','',$string));# without number format output: 50660
echo number_format(intval(preg_replace('/[^0-9.]/','',$string)));# with number format output :50,660
Este script cria um arquivo no início, grava números em uma linha e muda para a próxima linha se obtiver um caractere diferente de número. Por fim, novamente classifica os números em uma 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)
A introdução de hífens nesse processo é totalmente desnecessária. Essa resposta também não possui uma explicação de como funciona e por que você acha que é uma boa ideia.
Respostas:
fonte
$newstr = preg_replace('!\d+!', '', $str);
. Ele removerá todos os dígitos da sua string. Exemplo:$str = 'In My Cart : 11 12 items';
será exibidoIn My Cart : items
.preg_replace("/[^0-9]/","",$string);
orfilter_var($str, FILTER_SANITIZE_NUMBER_INT);
filter_var($str, FILTER_SANITIZE_NUMBER_INT);
dígitos extraídos, sinal de mais e menos . O regex extraiu apenas dígitos!Se você deseja filtrar tudo, exceto os números, o mais fácil é usar o filter_var :
fonte
xxx-yyy-24
você receberá--24
. Você pode usarstr_repleace(array('+','-'), '', $result)
para excluir os dois sinais.max(0,filter_var($str, FILTER_SANITIZE_NUMBER_INT))
usar matrizes e substituições de strings.abs((int) filter_var($str, FILTER_SANITIZE_NUMBER_INT));
Isso deve fazer um trabalho melhor! ...
fonte
500.00
será impresso:50000
extract the numbers from a string
- um ponto decimal não é um número!'
e não aspas duplas"
.Usando
preg_replace
:Saída: 1111111111
fonte
+387 (61) 634-783
string38761634783
diretamente. Você não precisa cuidar de matrizes como a resposta de Gaurav.+
quantificador corresponda a correspondências mais longas / menos substituições.Para números flutuantes,
Obrigado por apontar o erro. @mickmackusa
fonte
'!\d*.?\d+!'
?
como quantificador do ponto literal. Eu não esperaria que um valor flutuante contivesse vários símbolos de ponto decimal. O padrão comentado de Yash está errado ironicamente. O ponto precisa de uma barra na frente para torná-lo literal.Eu não possuo o crédito por isso, mas só tenho que compartilhá-lo. Essa regex obterá números de uma sequência, incluindo pontos decimais / casas, além de vírgulas:
/((?:[0-9]+,)*[0-9]+(?:\.[0-9]+)?)/
Citado aqui:
php - regex - como extrair um número com decimal (ponto e vírgula) de uma string (por exemplo, 1.120,01)?
fonte
Você pode usar preg_match :
fonte
echo '<p>'.$m[0].'</p>';
Usando preg_replace
fonte
+
quantificador corresponda a correspondências mais longas / menos substituições.Você pode usar a seguinte função:
fonte
\d
dentro de uma classe de personagem. Como você está acessando a correspondência de cadeia completa, não faz sentido gravar um grupo de captura no padrão.O primeiro argumento em implode neste caso específico diz "separe cada elemento em correspondências [0] com um único espaço". Implode não colocará um espaço (ou seja qual for o seu primeiro argumento) antes do primeiro número ou após o último número.
Outra coisa a notar é $ correspondências [0] é onde a matriz de correspondências (que correspondem a essa expressão regular) encontrada é armazenada.
Para obter mais esclarecimentos sobre o que os outros índices da matriz são, consulte: http://php.net/manual/en/function.preg-match-all.php
fonte
tente isso, use preg_replace
DEMO
fonte
[^0-9]
é mais simplesmente escrito como\D
.Ou
Ou
Isso retornará apenas o valor numérico
fonte
podemos extrair int dele como
demo: http://sandbox.onlinephpfunctions.com/code/82d58b5983e85a0022a99882c7d0de90825aa398
fonte
Siga esta etapa, ele converterá a string em número
Outra maneira de fazer isso:
fonte
de outra maneira (cadeia unicode par):
fonte
Este script cria um arquivo no início, grava números em uma linha e muda para a próxima linha se obtiver um caractere diferente de número. Por fim, novamente classifica os números em uma lista.
fonte
Dependendo do seu caso de uso, isso também pode ser uma opção:
Embora eu concorde com uma regex ou
filter_var()
seja mais útil no caso declarado.fonte
para utf8 str:
fonte
fonte
Esta função também manipula os números flutuantes
fonte