How to make Regex that accepts only numbers?

3

How do I use preg_match to only accept numbers? And can those numbers start with zero too?

function formatacao_cpf_func(){

    $regular = "/^[0-9]*$/";

    if(preg_match($regular, $this->cpf)){

    if(!is_numeric($this->cpf)){
        echo "O campo CPF só poderá conter Números";
        die;
    }

    if(strlen($this->cpf) > 11 || strlen($this->cpf) < 11 ){
        echo "Por favor informe o CPF com 11 digitos Válidos";
        $tamanho = strlen($this->cpf);
        echo $tamanho;
        die;
    }

    if(strlen($this->cpf) == 11){
       echo "CPF foi digitado corretamente </br>";
       $formatando_cpf_func = substr($this->cpf, 0, 3) . '.' . substr($this->cpf, 3, 3) . 
            '.' . substr($this->cpf, 6, 3) . '-' . substr($this->cpf, 9, 2);
       echo $formatando_cpf_func;
    }

   }
}
    
asked by anonymous 22.11.2017 / 00:11

2 answers

2

You can use ctype_digit() to check if string contains only numbers. is_numeric() accepts fractional numbers, negative numbers and plus sign.

var_dump(is_numeric(-1.33)); //true
var_dump(is_numeric(+1.33)); //true

Change:

$regular = "/^[0-9]*$/";
if(preg_match($regular, $this->cpf)){

if(!is_numeric($this->cpf)){
    echo "O campo CPF só poderá conter Números";
    die;
}

To:

if(!ctype_digit("$this->cpf")){
   echo "O campo CPF só poderá conter Números";
   die;
}

If you really want to use regex, you can use #^\d{11}$# which says that the string must have exactly eleven digits.

You can refactor this function to:

function formatacao_cpf_func(){

    $tamanhoCPF = strlen($this->cpf);

    if(!ctype_digit("$this->cpf") || $tamanhoCPF != 11) die('O campo CPF é inválido');


    echo "CPF foi digitado corretamente </br>";
    $arr = str_split($str, 3);
    printf('%s.%s.%s-%s', ...$arr);
}

Basically where they had two if, the conditions were now pooled to tell whether the input (cpf) is valid or not.

The way cpf is formatted has changed first the string is converted into an array separated by three characters each element ie four elements of length of 3 and the last one as 2

printf() or sprintf() " mount a mask based on the format. Remember that ... (ellipsis) only works from php5 .6 forward in earlier versions you need to specify array indexes or use the vprintf() function.

In the regex version the size is already validated along with the numeric characters.

function formatacao_cpf_func($cpf){

    $regex = '#^\d{11}$#';
    if(!preg_match($regex, $cpf)) die('O campo CPF é inválido');

    echo "CPF foi digitado corretamente </br>";
    $arr = str_split($cpf, 3);
    printf('%s.%s.%s-%s', ...$arr);
}
    
22.11.2017 / 12:19
0
 $regular = "#^\d+$#";

 if(preg_match($regular, $this->cpf)){
   // somente numero;

   if(strlen($this->cpf) == 11){
     // Uma ajuda extra com regEx para formatar o cpf
     $formatando_cpf_func = preg_replace("#(\d{3})(\d{3})(\d{3})(\d{2})#", "$1.$2.$3-$4", $this->cpf);
     echo "CPF foi digitado corretamente </br> $formatando_cpf_func";
   } else {
     echo "Por favor informe o CPF com 11 digitos Válidos";
     $tamanho = strlen($this->cpf);
     echo $tamanho;
     die;
   }
 } else {
   // if(!is_numeric($this->cpf)) <-- remover essa validação, não é necessária, já que foi feita com regex
   echo "O campo CPF só poderá conter Números";
   die;
 }
    
22.11.2017 / 12:12