Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera. preciso de uma ajuda..
Alguem sabe alguma expressão regular que evite o usuario a abreviar o nome?
eu até consegui tirar os pontos, mas mesmo assim, eles abreviam só com uma letra..
ex: Joao da S Moreira
esse S não poderá ser gravado dessa forma.
Alguem pode me ajudar?
Valeu pessoal
Um pequeno complemento seria, além dessa letra à deriva, verificar se ela está acompanhada de um ponto.
Eu por exemplo se fosse abreviar alguma coisa no teu site colocaria ele.
Não sei se está certo não ...
<?php
$String = 'João S s. s. .s da Silva Sauro' ;
preg_match_all( '~\s{1,}(\.+[a-zA-Z0-9]|[a-zA-Z0-9]\.+|[a-zA-Z0-9]){0,1}+\s~' , $String , $Match ) ;
echo '<pre>';
print_r( $Match );
Saída
Array
(
[0] => Array
(
[0] => S
[1] => s.
[2] => s.
[3] => .s
)
[1] => Array
(
[0] => S
[1] => s.
[2] => s.
[3] => .s
)
)[a-zA-Z0-9]|[a-zA-Z0-9]
wtf ??
ta complicada demais essa ER @Andrey..
se o cara digitar um ponto antes da Letra, então temos um erro de digitação, e não uma abreviação.
e como bem lembrado pelo @JBN, podem existir nomes assim:
Oliveira e Oliveira
por isso, que eu limitaria a:
espaco LETRA MAIUSCULA(ponto opcional) espaço
tão simples qnto isso..
veja também:
Eu acho que algo como:
/\s[a-df-zA-D-F-Z]\.?\s/
Já resolveria, pelo menos na língua portuguesa. A menos, é claro, que existam outras possibilidades de letras usadas como conectivos de nomes que não seja a letra E.
Eu não excluiria o E... como eu disse, apenas restringir a letras maiusculas. Somente isso.
galera.. simples.. simples..
/\s+[A-Z]{1}\.?\s+/
Pessoal desculpe a demora para responder... Mas se eu restringir a letra maiuscula como disse o William Bruno, não estará consistente ainda. Pois se o usuario digitar o sobrenome com letra minuscula ele vai passar nao vai?
Ahá! E chegamos ao ponto em que eu defendi veementemente antes do tópico ser assassinado.
Que bom que mais alguém pensa como eu. Desculpem se pode parecer meio ácido, mas agora sou eu quem quer ver o 'Getting Real" resolvendo isso. :lol:
Ai é simples amigo leo_SJCampos. Todo nome para ser escrito corretamente tem de ter a primeira letra maiúscula. Ex: Bruno Augusto.
Se o usuário escrever tudo em minúsculo vai estar incorreto não? Se utilizar a função ucwords() esse problema não mais ocorrerá. ^_^
Já resolve 2 "problemas" em uma cajadada só :P
Um pequeno porém, Periscuelo, para que ucwords() funcione de maneira uniforme em todos os servidores, em todas as instalações, até onde me consta, a string tem, primeiro, de passar por strtolower():
$string = ucwords( strtolower( $string ) );
Porém, um nome, nos casos mais pomposos ou tradicionais, existem alguns conectivos que devem ser todo em minúsculas, como por exemplo: san, von, di e etc.
"Entre o povão", temos o e, de, da, do e etc.
Com isso algo um pouco mais trabalhado deve ser elaborado. Algo como um recapitalizador de strings que mencionei nesse "tópico assassinado" que ajusta 99% de um dado texto, desde que configurado adequadamente ao idioma de origem.
Ai então perde o sentido amigo Bruno. O que impede o usuário de escrever di,san,von e etc em Maiúsculo? Com a primeira ou a Ultima letra de forma errada?
Concorda comigo que não da pra fazer uma expressão regular que controle tudo isso? Porque tanto empenho em fazer algo elaborado se não da pra fazer
o usuário escrever tudo da forma correta? Imagine as N possibilidades que o usuário tem de fazer errado. Quantos conectivos em quantos idiomas existem???
Ou se utiliza algo simples e deixa os erros de grafia por conta de usuário ou vai se desenvolvendo rotinas tão complexas para ratificar o usuário que se perde mais
tempo com isto doque com o resto do desenvolvimento do sistema. O ucwords seria uma forma de padronizar a escrita simplificando a solução. Alguns sistemas
convertem tudo para uppercase para não ter de se preocupar com tantos pormenores, outros porque facilita a leitura, mas todos seguem um padrão para facilitar o
desenvolvimento e a funcionalidade do sistema. Na minha opnião fica melhor padronizando.
Abraços.
Mas não é complexo, só parece. Claro, uma única ER é impossível, mesmo porque você tem dois caminhos a trilhar, um após o outro: Recapitalizar e só então verificar.
Para recapitalizar, se não me engano (não tenho o arquivo aqui agora), usei, na época que precisei, três ER's, num preg_replace().
Resolveu 99% dos casos. Teve uma circunstância, acho que com um C-Cedilha que falhou, ficando só ele maiúscula no meio da palavra.
Claro, hoje posso fazer melhor, mas na época eu era bem mais cru do que sou hoje, e ainda assim ficou bom.
upper e low tem problema com acentos, precisa usar a função MB
Pois se o usuario digitar o sobrenome com letra minuscula ele vai passar nao vai?
mas ai temos outra coisa, que deve ser responsabilidade de um outro método, q é praticamente impossível de ser escrito.
Validar se ele não digitou abreviações, se resolve da forma que propus.
Validar erros de digitação, é uma outra história, e deve ser tratado aparte, depois de ter resolvido o primeiro problema.
Para este caso, pessoalmente me parece ser algo não necessário, e complicado deveras, visto os diversos desdobramentos que podem ocorrer.
>
então, oq você precisa casar, é se existe uma letra sozinha no meio de 2 espaços.
então a abreviação de junior vai passar - jr
>
então a abreviação de junior vai passar - jr
Gente, estão ficando loucos?
Vocês vão ficar velhos e carecas antes de conseguirem validar todas as possibilidades de abreviação de nomes e acreditem, não vão conseguir validar todas.
Avisem o usuário que não pode e pronto :seta: "Preencha seu nome sem abreviações".
puts.. vim aqui só pra dizer exatamente isso
"Preencha seu nome sem abreviações".
rsss :joia:
Bom pessoal, ja que ficou complicado, resolvi fazer da maneira mais simples.. Como eu verifico isso no PHP e retorno o resultado via JSON criei uma função que verifica se há espaço entre a letra usando o strstr
$nome = strtoupper($_REQUEST['nome']);
if( strstr($nome," A ")){
echo "{result:0 message:'NOME NAO PODE SER ABREVIADO'}";
}else{
echo "{result:1 message: OK}";
}
Fiz isso para cada letra, e uso a expressão regular
/([a-zA-Z\s]+)$/
para permitir somente letras e sendo assim, proibo o uso de numeros e pontos..
Não foi a melhor maneira de resolver, mas a principio deu certo..
Valeu pela força pessoal....
>
Como eu verifico isso no PHP e retorno o resultado via JSON criei uma função que verifica se há espaço entre a letra usando o
Você não precisa enviar para o PHP e retornar como JSON. Utilize Javascript:
String.indexOf()
var someString = "João Batista de Paula e Silva";
var otherString = "Maria E Oliveira"; //Minha tia chama-se Maria Elena, com E, não com H.
if ( someString.toUpperCase().indexOf( ' E ' ) >= 0 ) {
alert( "Esse caminho está errado!!!\n\nÉ melhor avisar ao usuário para não abreviar do que ficar tentando validar o invalidável" );
} else {
alert( 'OK => será?' );
}
if ( otherString.toUpperCase().indexOf( ' E ' ) >= 0 ) {
alert( "Esse caminho está errado!!!\n\nÉ melhor avisar ao usuário para não abreviar do que ficar tentando validar o invalidável" );
} else {
alert( 'OK => será?' );
}
>
Fiz isso para cada letra, e uso a expressão regular
/([a-zA-Z\s]+)$/
para permitir somente letras e sendo assim, proibo o uso de numeros e pontos..
Utilize a expressão regular no Javascript também.
RegExp.test()
if ( /([a-zA-Z\s]+)$/.test( theString ) {
//...
}
>
mas a principio deu certo..
Não deu certo, você apenas não viu o problema ainda.
É que eu quis simplificar grande João Batista Neto hehe...
na View eu uso EXTJS, então eu uso a Expressão regular no proprio atributo do objeto, e a expressão que eu coloquei no post de cima esta errada,, na verdade estou usando a que vou colocar abaixo para voces entenderem o que eu fiz...
Tambem tinha um erro non Json de retorno, estava sem virgula, estou corrigindo agora...
var nome = new Ext.form.TextField({
fieldLabel: 'Nome',
name: 'nome',
allowBlank: false,
width: 280,
maskRe:/([a-zA-Z0-9\s]+)$/
});
nome.on({
'blur': function(field){
Ext.Ajax.request({
url:'../teste/teste.php',
params: {
nome: nome.getValue()
},
success:function(response){
var json = Ext.decode(response.responseText);
if(json.result == 0){
Ext.Msg.show({ title:'ERRO', msg:json.message, buttons:Ext.Msg.OK, icon:Ext.MessageBox.ERROR, scope:this, width:250});
}
}
});
e no PHP
$nome = strtoupper($_REQUEST['nome']);
if( strstr($nome," A ")){
echo "{result:0, message:'NOME NAO PODE SER ABREVIADO'}";
}
if( strstr($nome," B ")){
echo "{result:0, message:'NOME NAO PODE SER ABREVIADO'}";
}
....
Aqui pra mim deu certo....
OBS.. Não sei se tem como eu usar o toUpperCase no EXTJS. vou verificar, se tiver como, crio uma função la mesmo e não preciso fazer essa requisição para o PHP nesse momento.
Valeu pela força ai...
que gambiarra rapaz !! ta louco testar com varios ifs, letra por letra.. insano isso!!
apenas a ER que sugeri resolve o problema.
esqueça os erros de digitação.
analise o padrão:
blabla L blabla
ali ao redor você tem:
espaco Letra espaço
então, oq você precisa casar, é se existe uma letra sozinha no meio de 2 espaços.
Faça a tua ER com isso. Assim q se constroi ERs, analisando o padrão.