Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Prove Yourself

[Resolvido] Regex e Locale

Recommended Posts

Tenho o seguinte código:

<?php
header('content-type: text/html; charset=utf-8');

require_once('../../system/lib/model.class.php');
require_once('../../system/lib/invalidparameterexception.class.php');
require_once('../model/professormodel.class.php');

setlocale(LC_ALL, 'pt_BR', 'ptb');

$professor = new Professor();

$professor->setNome('joão pedro');
echo $professor->getNome() . '<br />';
?>
Classe Professor
<?php
class Professor extends Model {
    private $id;
    private $nome;
    private $email;
    private $telefoneComercial;
    private $telefoneCelular;
    private $cargaHoraria;
    private $titulacao;
    private $cursoLeciona;
    private $disciplina;
    private $status;
    private $lattes;
    
    public function getId() {
        return $this->id;
    }
    
    public function getNome() {
        return $this->nome;
    }
    
    public function getEmail() {
        return $this->email;
    }
    
    public function getTelefoneComercial() {
        return $this->telefoneComercial;
    }
    
    public function getTelefoneCelular() {
        return $this->telefoneCelular;
    }
    
    public function getCargaHoraria() {
        return $this->cargaHoraria;
    }
    
    public function getTitulacao() {
        return $this->titulacao;
    }
    
    public function getCursoLeciona() {
        return $this->cursoLeciona;
    }
    
    public function getDisciplina() {
        return $this->disciplina;
    }
    
    public function getStatus() {
        return $this->status;
    }
    
    public function getLattes() {
        return $this->lattes;
    }
    
    public function setId($id) {
        $id = (int) $id;
        
        if($id) {
            $this->id = $id;
        } else {
            throw new InvalidParameterException('Código do professor inválido');
        }
    }
    
    public function setNome($nome) {
        if(preg_match('/^[[:alpha:] ]+$/', $nome)) {
            $this->nome = $nome;
        } else {
            throw new InvalidParameterException('Nome do professor inválido');
        }
    }
    
    public function setEmail($email) {
        $this->email = $email;
    }
    
    public function setTelefoneComercial($telefoneComercial) {
        $this->telefoneComercial = $telefoneComercial;
    }
    
    public function setTelefoneCelular($telefoneCelular) {
        $this->telefoneCelular = $telefoneCelular;
    }
    
    public function setCargaHoraria($cargaHoraria) {
        $this->cargaHoraria = $cargaHoraria;
    }
    
    public function setTitulacao($titulacao) {
        $this->titulacao = $titulacao;
    }
    
    public function setCursoLeciona($cursoLeciona) {
        $this->cursoLeciona = $cursoLeciona;
    }
    
    public function setDisciplina($disciplina) {
        $this->disciplina = $disciplina;
    }
    
    public function setStatus($status) {
        $this->status = $status;
    }
    
    public function setLattes($lattes) {
        $this->lattes = $lattes;
    }
}
?>
Mesmo configurando o locale, a regex if(preg_match('/^[[:alpha:] ]+$/', $nome)) do método setNome não funciona se eu passar acentos. Recebo a exception:
Fatal error: Uncaught exception 'InvalidParameterException' with message 'Nome do professor inválido' in /var/www/professores/app/model/professormodel.class.php:73 Stack trace: #0 /var/www/professores/app/tests/professortest.php(12): Professor->setNome('jo??o pedro') #1 {main} thrown in /var/www/professores/app/model/professormodel.class.php on line 73

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho o seguinte código:

public function setNome($nome) {
	if(preg_match('/^[[:alpha:] ]+$/', $nome)) {
 	$this->nome = $nome;
	} else {
 	throw new InvalidParameterException('Nome do professor inválido');
	}
 }

Mesmo configurando o locale, a regex if(preg_match('/^[[:alpha:] ]+$/', $nome)) do método setNome não funciona se eu passar acentos.

 

Tenta assim:

class Professor {
//...

public function setNome( $nome ){
	if ( preg_match( '/^[\xc3\x80-\xc3\x96\xc3\x98-\xc3\xb6\xc3\xb8-\xc3\xbfa-zA-Z ]+$/' , $nome ) ){
 	$this->nome =& $nome;
	} else {
 	throw new InvalidParameterException('Nome do professor inválido');
	}
}

//...
}

$neto = new Professor();
$neto->setNome( 'João Batista Neto' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia João, tudo bem?

 

Você pode me explicar o que você está fazendo aí exatamente? Tem alguma referência para que eu possa ler e aprender sobre?

 

Obrigado pela atenção... Um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia João, tudo bem?

 

Você pode me explicar o que você está fazendo aí exatamente? Tem alguma referência para que eu possa ler e aprender sobre?

 

Obrigado pela atenção... Um abraço.

 

Na expressão regular, quando usamos: [a-z] indicamos que estamos procurando qualquer coisa que esteja no intervalo que inicia em a e termina em z inclusive.

A questão é que quando trabalhamos com utf-8 são utilizados dois caracteres para representar um acento, por exemplo:

 

$atilde = 'ã';

for ( $i = 0 ; isset( $atilde{ $i } ) ; ++$i )
var_dump( ord( $atilde{ $i } ) );

 

Isso irá exibir:

int(195)

int(163)

 

Se convertermos os decimais para hexadecimal:

$atilde = 'ã';

for ( $i = 0 ; isset( $atilde{ $i } ) ; ++$i )
var_dump( dechex( ord( $atilde{ $i } ) ) );

 

A saída será:

string(2) "c3"

string(2) "a3"

 

 

Na expressão regular, quando utilizamos o \x significa que estamos procurando alguma coisa cujo hexadecimal seja o especificado: \xc3

 

Como o ã usa dois caracteres: \xc3\xa3

 

Como disse inicialmente, você pode utilizar o - para especificar o intervalo, ai basta você pegar uma tabela unicode e ver quais caracteres precisa:

 

UTF-8:

<U00C0> /xc3/x80 LATIN CAPITAL LETTER A WITH GRAVE

<U00C1> /xc3/x81 LATIN CAPITAL LETTER A WITH ACUTE

<U00C2> /xc3/x82 LATIN CAPITAL LETTER A WITH CIRCUMFLEX

<U00C3> /xc3/x83 LATIN CAPITAL LETTER A WITH TILDE

<U00C4> /xc3/x84 LATIN CAPITAL LETTER A WITH DIAERESIS

<U00C5> /xc3/x85 LATIN CAPITAL LETTER A WITH RING ABOVE

<U00C6> /xc3/x86 LATIN CAPITAL LETTER AE

<U00C7> /xc3/x87 LATIN CAPITAL LETTER C WITH CEDILLA

<U00C8> /xc3/x88 LATIN CAPITAL LETTER E WITH GRAVE

<U00C9> /xc3/x89 LATIN CAPITAL LETTER E WITH ACUTE

<U00CA> /xc3/x8a LATIN CAPITAL LETTER E WITH CIRCUMFLEX

<U00CB> /xc3/x8b LATIN CAPITAL LETTER E WITH DIAERESIS

<U00CC> /xc3/x8c LATIN CAPITAL LETTER I WITH GRAVE

<U00CD> /xc3/x8d LATIN CAPITAL LETTER I WITH ACUTE

<U00CE> /xc3/x8e LATIN CAPITAL LETTER I WITH CIRCUMFLEX

<U00CF> /xc3/x8f LATIN CAPITAL LETTER I WITH DIAERESIS

<U00D0> /xc3/x90 LATIN CAPITAL LETTER ETH

<U00D1> /xc3/x91 LATIN CAPITAL LETTER N WITH TILDE

<U00D2> /xc3/x92 LATIN CAPITAL LETTER O WITH GRAVE

<U00D3> /xc3/x93 LATIN CAPITAL LETTER O WITH ACUTE

<U00D4> /xc3/x94 LATIN CAPITAL LETTER O WITH CIRCUMFLEX

<U00D5> /xc3/x95 LATIN CAPITAL LETTER O WITH TILDE

<U00D6> /xc3/x96 LATIN CAPITAL LETTER O WITH DIAERESIS

 

...

 

<U00D8> /xc3/x98 LATIN CAPITAL LETTER O WITH STROKE

<U00D9> /xc3/x99 LATIN CAPITAL LETTER U WITH GRAVE

<U00DA> /xc3/x9a LATIN CAPITAL LETTER U WITH ACUTE

<U00DB> /xc3/x9b LATIN CAPITAL LETTER U WITH CIRCUMFLEX

<U00DC> /xc3/x9c LATIN CAPITAL LETTER U WITH DIAERESIS

<U00DD> /xc3/x9d LATIN CAPITAL LETTER Y WITH ACUTE

<U00DE> /xc3/x9e LATIN CAPITAL LETTER THORN

<U00DF> /xc3/x9f LATIN SMALL LETTER SHARP S

<U00E0> /xc3/xa0 LATIN SMALL LETTER A WITH GRAVE

<U00E1> /xc3/xa1 LATIN SMALL LETTER A WITH ACUTE

<U00E2> /xc3/xa2 LATIN SMALL LETTER A WITH CIRCUMFLEX

<U00E3> /xc3/xa3 LATIN SMALL LETTER A WITH TILDE

<U00E4> /xc3/xa4 LATIN SMALL LETTER A WITH DIAERESIS

<U00E5> /xc3/xa5 LATIN SMALL LETTER A WITH RING ABOVE

<U00E6> /xc3/xa6 LATIN SMALL LETTER AE

<U00E7> /xc3/xa7 LATIN SMALL LETTER C WITH CEDILLA

<U00E8> /xc3/xa8 LATIN SMALL LETTER E WITH GRAVE

<U00E9> /xc3/xa9 LATIN SMALL LETTER E WITH ACUTE

<U00EA> /xc3/xaa LATIN SMALL LETTER E WITH CIRCUMFLEX

<U00EB> /xc3/xab LATIN SMALL LETTER E WITH DIAERESIS

<U00EC> /xc3/xac LATIN SMALL LETTER I WITH GRAVE

<U00ED> /xc3/xad LATIN SMALL LETTER I WITH ACUTE

<U00EE> /xc3/xae LATIN SMALL LETTER I WITH CIRCUMFLEX

<U00EF> /xc3/xaf LATIN SMALL LETTER I WITH DIAERESIS

<U00F0> /xc3/xb0 LATIN SMALL LETTER ETH

<U00F1> /xc3/xb1 LATIN SMALL LETTER N WITH TILDE

<U00F2> /xc3/xb2 LATIN SMALL LETTER O WITH GRAVE

<U00F3> /xc3/xb3 LATIN SMALL LETTER O WITH ACUTE

<U00F4> /xc3/xb4 LATIN SMALL LETTER O WITH CIRCUMFLEX

<U00F5> /xc3/xb5 LATIN SMALL LETTER O WITH TILDE

<U00F6> /xc3/xb6 LATIN SMALL LETTER O WITH DIAERESIS

 

...

 

<U00F8> /xc3/xb8 LATIN SMALL LETTER O WITH STROKE

<U00F9> /xc3/xb9 LATIN SMALL LETTER U WITH GRAVE

<U00FA> /xc3/xba LATIN SMALL LETTER U WITH ACUTE

<U00FB> /xc3/xbb LATIN SMALL LETTER U WITH CIRCUMFLEX

<U00FC> /xc3/xbc LATIN SMALL LETTER U WITH DIAERESIS

<U00FD> /xc3/xbd LATIN SMALL LETTER Y WITH ACUTE

<U00FE> /xc3/xbe LATIN SMALL LETTER THORN

<U00FF> /xc3/xbf LATIN SMALL LETTER Y WITH DIAERESIS

 

Você poderia continuar para aceitar mais caracteres acentuados, mas não acredito que seja o caso.

 

:P

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.