Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 73Bom 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.
>
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
Ótima explicação, parabéns e muito obrigado!
Um abraço, tudo de bom!
>
Tenho o seguinte código:
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 {
//...
//...
}