Extrair números de uma sequência

332

Quero extrair os números de uma string que contém números e letras como:

"In My Cart : 11 items"

Quero aqui obter o número 11ou qualquer outro número.

Bizboss
fonte
Use este $ string = "No meu carrinho: 11 itens"; $ number = preg_replace ("/ [^ 0-9] {1,4} /", '', $ string); // return 11
Shorabh 12/04/19

Respostas:

363
$str = 'In My Cart : 11 12 items';
preg_match_all('!\d+!', $str, $matches);
print_r($matches);
Gaurav
fonte
2
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 :

$str = 'In My Cart : 11 items';
$int = (int) filter_var($str, FILTER_SANITIZE_NUMBER_INT);
Daniel Bøndergaard
fonte
56
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.
Shiva Avula
26
abs((int) filter_var($str, FILTER_SANITIZE_NUMBER_INT));
MECU
300
preg_replace('/[^0-9]/', '', $string);

Isso deve fazer um trabalho melhor! ...

Mahipalsinh Ravalji
fonte
10
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 ".
usar o seguinte comando
16
preg_replace ('/ [^ 0-9.] /', '', 'abc1.22'); // retorna decimal 1,22
zzapper 25/08
84

Usando preg_replace:

$str = '(111) 111-1111';
$str = preg_replace('/\D/', '', $str);
echo $str;

Saída: 1111111111

Akash Deep
fonte
4
Está funcionando muito bem. Ele converte a +387 (61) 634-783string 38761634783diretamente. Você não precisa cuidar de matrizes como a resposta de Gaurav.
beytarovski
1
Definitivamente a melhor resposta. sandbox.onlinephpfunctions.com/code/...
Steffan
Eu recomendo que o +quantificador corresponda a correspondências mais longas / menos substituições.
mickmackusa 19/02
21

Para números flutuantes,

preg_match_all('!\d+\.?\d+!', $string ,$match);

Obrigado por apontar o erro. @mickmackusa

Yash
fonte
É realmente errado :) Deve ser'!\d*.?\d+!'
Yash
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:

/((?:[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)?

mroncetwice
fonte
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.
mickmackusa 19/02
9

Você pode usar preg_match :

$s = "In My Cart : 11 items";
preg_match("|\d+|", $s, $m);
var_dump($m);
Dmitri Gudkov
fonte
echo '<p>'.$m[0].'</p>';
Pathros
9

Usando preg_replace

$str = 'In My Cart : 11 12 items';
$str = preg_replace('/\D/', '', $str);
echo $str;
Hariadi
fonte
Eu recomendo que o +quantificador corresponda a correspondências mais longas / menos substituições.
mickmackusa 19/02
6

Você pode usar a seguinte função:

function extract_numbers($string)
{
   preg_match_all('/([\d]+)/', $string, $match);

   return $match[0];
}
Jasmeen
fonte
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.
mickmackusa
4
preg_match_all('!\d+!', $some_string, $matches);
$string_of_numbers = implode(' ', $matches[0]);

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

Bradley Kovacs
fonte
4

tente isso, use preg_replace

$string = "Hello! 123 test this? 456. done? 100%";
$int = intval(preg_replace('/[^0-9]+/', '', $string), 10);
echo $int;

DEMO

Dave
fonte
[^0-9]é mais simplesmente escrito como \D.
mickmackusa
3
$value = '25%';

Ou

$value = '25.025$';

Ou

$value = 'I am numeric 25';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

Isso retornará apenas o valor numérico

Rakesh
fonte
3

Siga esta etapa, ele converterá a string em número

$value = '$0025.123';
$onlyNumeric = filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
settype($onlyNumeric,"float");

$result=($onlyNumeric+100);
echo $result;

Outra maneira de fazer isso:

$res = preg_replace("/[^0-9.]/", "", "$15645623.095605659");
jewelhuq
fonte
0

de outra maneira (cadeia unicode par):

$res = array();
$str = 'test 1234 555 2.7 string ..... 2.2 3.3';
$str = preg_replace("/[^0-9\.]/", " ", $str);
$str = trim(preg_replace('/\s+/u', ' ', $str));
$arr = explode(' ', $str);
for ($i = 0; $i < count($arr); $i++) {
    if (is_numeric($arr[$i])) {
        $res[] = $arr[$i];
    }
}
print_r($res); //Array ( [0] => 1234 [1] => 555 [2] => 2.7 [3] => 2.2 [4] => 3.3 ) 
Mehrdad
fonte
0

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)
Abhishek Poudel
fonte
-1

Dependendo do seu caso de uso, isso também pode ser uma opção:

$str = 'In My Cart : 11 items';
$num = '';

for ($i = 0; $i < strlen($str); $i++) {

    if (is_numeric($str[$i])) {
        $num .= $str[$i];
    }
}

echo $num; // 11

Embora eu concorde com uma regex ou filter_var()seja mais útil no caso declarado.

Kasimir
fonte
-1

para utf8 str:

function unicodeStrDigits($str) {
    $arr = array();
    $sub = '';
    for ($i = 0; $i < strlen($str); $i++) { 
        if (is_numeric($str[$i])) {
            $sub .= $str[$i];
            continue;
        } else {
            if ($sub) {
                array_push($arr, $sub);
                $sub = '';
            }
        }
    }

    if ($sub) {
        array_push($arr, $sub); 
    }

    return $arr;
}
Mehrdad
fonte
-1

Se você não sabe qual é o formato do número? int ou flutuante, use este:

$string = '$125.22';

$string2 = '$125';

preg_match_all('/(\d+.?\d+)/',$string,$matches); // $matches[1] = 125.22

preg_match_all('/(\d+.?\d+)/',$string2,$matches); // $matches[1] = 125
Sajjad Hossain Sagor
fonte
-1

Esta função também manipula os números flutuantes

$str = "Doughnuts, 4; doughnuts holes, 0.08; glue, 3.4";
$str = preg_replace('/[^0-9\.]/','-', $str);
$str = preg_replace('/(\-+)(\.\.+)/','-', $str);
$str = trim($str, '-');
$arr = explode('-', $str);
Khaldoon Masud
fonte
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.
mickmackusa 19/02