{"id":146,"date":"2020-12-03T03:55:22","date_gmt":"2020-12-03T03:55:22","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=146"},"modified":"2020-12-10T23:06:37","modified_gmt":"2020-12-10T23:06:37","slug":"php-regex-para-validacao-de-senhas","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2020\/12\/03\/php-regex-para-validacao-de-senhas\/","title":{"rendered":"PHP Regex para Valida\u00e7\u00e3o de Senhas"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>function isValidPassword($password) {\n    $pattern = '\/^(?=.*\\d)(?=.*&#91;a-z])(?=.*&#91;A-Z])&#91;a-zA-Z\\d].\\S{8,36}$\/';\n\n    return preg_match($pattern, $password) ? true : false;\n}<\/code><\/pre>\n\n\n\n<p>Voc\u00ea \u00e9 bom em REGEX? Sabe o que \u00e9 ou para que serve? J\u00e1 precisou aplicar regras de valida\u00e7\u00e3o de senhas e n\u00e3o usou REGEX? Ent\u00e3o voc\u00ea pode ler este artigo para come\u00e7ar a explorar mais sobre este recurso.<\/p>\n\n\n\n<p>Primeiramente vou deixar claro que o objetivo do artigo n\u00e3o \u00e9 ensinar REGEX amplamente, ao inv\u00e9s disso vamos aplicar o recurso num problema pr\u00e1tico explicando o processo de valida\u00e7\u00e3o de senhas segundo um cen\u00e1rio de regras, aqui vai&#8230;<\/p>\n\n\n\n<p>Regra 1 &#8211; A senha deve ter no m\u00ednimo 8 e no m\u00e1ximo 36 caracteres.<\/p>\n\n\n\n<p>Regra 2 &#8211; A senha deve ser composta de ao menos 1 n\u00famero, ao menos uma letra mai\u00fascula, e ao menos uma letra min\u00fascula.<\/p>\n\n\n\n<p>Regra 3 &#8211; A senha deve ser composta de apenas letras e n\u00fameros e n\u00e3o deve possuir nenhum tipo de caracteres especiais.<\/p>\n\n\n\n<p>No PHP para verificarmos um texto com REGEX podemos usar o recurso preg_match. Como o nome j\u00e1 diz o comando vai verificar o conte\u00fado do texto segundo uma combina\u00e7\u00e3o de m\u00e1scaras para encontrar a combina\u00e7\u00e3o desejada.<\/p>\n\n\n\n<p>Confuso? Ent\u00e3o vamos a parte pr\u00e1tica, observe primeiramente a m\u00e1scara postada com esta sintaxe.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'\/^(?=.*\\d)(?=.*&#91;a-z])(?=.*&#91;A-Z])&#91;a-zA-Z\\d].\\S{8,36}$\/'<\/code><\/pre>\n\n\n\n<p>Para entender como a regra funciona temos que desmont\u00e1-la e explicar em partes. <\/p>\n\n\n\n<p>Entenda que com REGEX voc\u00ea monta uma m\u00e1scara aos poucos, assim tente n\u00e3o pensar em aplicar a regra 1 primeiro, depois a regra 2 e no final a regra 3. Geralmente temos que come\u00e7ar aplicar o que \u00e9 mais f\u00e1cil, mais simples e ir aumentando a complexidade gradativamente. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'\/(?=.*\\d)\/'<\/code><\/pre>\n\n\n\n<p>Esta m\u00e1scara garante que a senha contenha ao menos 1 n\u00famero, o que \u00e9 parte da exig\u00eancia da regra 2.<\/p>\n\n\n\n<p>Pense nesta m\u00e1scara como sendo uma varredura completa do texto onde ? \u00e9 cada um dos caracteres da senha podendo ser igual a qualquer coisa (.*) desde que seja num\u00e9rico (\\d). <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'\/(?=.*\\d)(?=.*&#91;a-z])\/'<\/code><\/pre>\n\n\n\n<p>Esta segunda parte garante que a senha contenha ao menos 1 letra min\u00fascula, que tamb\u00e9m \u00e9 parte da exig\u00eancia da regra 2.<\/p>\n\n\n\n<p>Pense que cada m\u00e1scara entre par\u00eanteses \u00e9 uma varredura individual em que o resultado da varredura deve ser TRUE quando fizer o match desejado.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'\/(?=.*\\d)(?=.*&#91;a-z])(?=.*&#91;A-Z])\/'<\/code><\/pre>\n\n\n\n<p>O terceiro par\u00eanteses cont\u00e9m a mesma valida\u00e7\u00e3o que o segundo, s\u00f3 que como o REGEX \u00e9 case sensitive por padr\u00e3o temos que validar com os dois formatos separadamente, letras min\u00fasculas e letras mai\u00fasculas separamente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'\/(?=.*\\d)(?=.*&#91;a-z])(?=.*&#91;A-Z])&#91;a-zA-Z\\d]\/'<\/code><\/pre>\n\n\n\n<p>A pr\u00f3xima m\u00e1scara adicionada quase garante que todos os caracteres do texto sejam letras e n\u00fameros apenas. Sim, eu disse quase, mas ainda temos que garantir que a combina\u00e7\u00e3o desejada seja validada do in\u00edcio ao fim do texto, caso contr\u00e1rio as extremidades (bordas) do texto poder\u00e3o conter caracteres indesejadados.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'\/^(?=.*\\d)(?=.*&#91;a-z])(?=.*&#91;A-Z])&#91;a-zA-Z\\d]$\/'<\/code><\/pre>\n\n\n\n<p>Agora sim, o acento circunflexo \u02c6 garante que a valida\u00e7\u00e3o vai ser realizada a partir do primeiro caracter da senha e o d\u00f3lar $ garante que a combina\u00e7\u00e3o desejada ser\u00e1 feita at\u00e9 o \u00faltimo caracter da senha.<\/p>\n\n\n\n<p>Regra 3 conclu\u00edda? Parece que sim, s\u00f3 que n\u00e3o&#8230; deixa pa l\u00e1, resolvemos depois.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'\/^(?=.*\\d)(?=.*&#91;a-z])(?=.*&#91;A-Z])&#91;a-zA-Z\\d]{8,36}$\/'<\/code><\/pre>\n\n\n\n<p>Olha que f\u00e1cil, para determinar as quantidades m\u00ednimas e m\u00e1ximas de caracteres basta inserir estes limitadores entre chaves {} sendo o primeiro n\u00famero a quantidade m\u00ednima de caracteres requerida e o segundo n\u00famero a quantidade m\u00e1xima requerida.<\/p>\n\n\n\n<p>Parece que a regra est\u00e1 completa, n\u00e3o parece? Ent\u00e3o onde est\u00e1 o BUG?<\/p>\n\n\n\n<p>Seguinte, espa\u00e7os em brancos passam batidos na valida\u00e7\u00e3o de letras e n\u00fameros, justamente por que espa\u00e7o em branco n\u00e3o \u00e9 nada. N\u00e3o \u00e9 letra, n\u00e3o \u00e9 n\u00famero, n\u00e3o \u00e9 caracter especial, nada. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'\/^(?=.*\\d)(?=.*&#91;a-z])(?=.*&#91;A-Z])&#91;a-zA-Z\\d].\\S{8,36}$\/'<\/code><\/pre>\n\n\n\n<p>Pronto, com o .\\S garantimos que espa\u00e7os em brancos n\u00e3o estejam presentes na senha. Maravilha!<\/p>\n\n\n\n<p>Mas voc\u00ea ainda pode estar se perguntando sobre as barras \/ no \u00ednicio e fim da m\u00e1scara e tamb\u00e9m o recobrimento com as aspas, certo?<\/p>\n\n\n\n<p>O REGEX requer o recobrimento com delimitadores, no meu caso escolhi o mais trivial que s\u00e3o barras normais SLASHES. Mas voc\u00ea poderia utilizar outros caracteres a seu crit\u00e9rio como PIPE | ou NUMBER #. O interessante \u00e9 que voc\u00ea use como delimitador algum caracter que voc\u00ea n\u00e3o v\u00e1 utilizar na composi\u00e7\u00e3o da m\u00e1scara.<\/p>\n\n\n\n<p>Por fim, uma m\u00e1scara \u00e9 uma string, assim temos que recobri-la com aspas, que podem ser simples &#8221; ou duplas &#8220;&#8221;, tanto faz.<\/p>\n\n\n\n<p>Ent\u00e3o, gostou do REGEX? Isso \u00e9 um mundo a parte, pegar profici\u00eancia neste campo requer muito empenho mas vale a pena. <\/p>\n\n\n\n<p>Eu nunca encontrei um treinamento que te ensina como pensar em REGEX, mas acho que isso \u00e9 algo que somente se adquire com tempo e experi\u00eancia. <\/p>\n\n\n\n<p>Ent\u00e3o, boa sorte!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voc\u00ea \u00e9 bom em REGEX? Sabe o que \u00e9 ou para que serve? J\u00e1 precisou aplicar regras de valida\u00e7\u00e3o de senhas e n\u00e3o usou REGEX? Ent\u00e3o voc\u00ea pode ler este artigo para come\u00e7ar a explorar mais sobre este recurso. Primeiramente vou deixar claro que o objetivo do artigo n\u00e3o \u00e9 ensinar REGEX amplamente, ao inv\u00e9s [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,2,3],"tags":[68,67,66],"class_list":["post-146","post","type-post","status-publish","format-standard","hentry","category-backend","category-coding","category-php","tag-match","tag-preg_match","tag-regex"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/comments?post=146"}],"version-history":[{"count":3,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/146\/revisions"}],"predecessor-version":[{"id":149,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/146\/revisions\/149"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}