{"id":3200,"date":"2015-04-09T14:47:54","date_gmt":"2015-04-09T17:47:54","guid":{"rendered":"http:\/\/blog.dialhost.com.br\/?p=3200"},"modified":"2019-05-10T15:46:47","modified_gmt":"2019-05-10T18:46:47","slug":"strlen-desvendando-os-tamanhos-de-uma-string","status":"publish","type":"post","link":"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/","title":{"rendered":"strlen, desvendando os tamanhos de uma string"},"content":{"rendered":"\n<p>Ol\u00e1 Pessoal, estou dando continuidade a s\u00e9rie de tratamento de strings. Aos que j\u00e1 acompanharam o post passado, falei sobre a <a title=\"Levenshtein \u2013 Tratamento de strings com PHP\" href=\"http:\/\/blog.dialhost.com.br\/tecnologia\/programacao\/levenshtein-tratamento-de-strings-com-php\/\" target=\"_blank\" rel=\"noopener noreferrer\">fun\u00e7\u00e3o Levenshtein<\/a> e deixei a dica de que pod\u00edamos melhorar a relev\u00e2ncia da compara\u00e7\u00e3o atrav\u00e9s do strlen().<\/p>\n\n\n\n<p>Para este post falarei um pouco sobre a fun\u00e7\u00e3o <strong>strlen()<\/strong>. Ela j\u00e1 \u00e9 bem conhecida e pode ser utilizada para diversas finalidades entre elas: validar a entrada em uma condi\u00e7\u00e3o, contar se uma determinada string encontra-se no limite de caracteres (lembram do limite do twitter?) e limita\u00e7\u00e3o de loops.<\/p>\n\n\n\n<h2>Definindo a fun\u00e7\u00e3o strlen()<\/h2>\n\n\n\n<p>A defini\u00e7\u00e3o n\u00e3o \u00e9 muito complexa, por\u00e9m sua aplica\u00e7\u00e3o pode ser feita em &#8220;N&#8221; situa\u00e7\u00f5es o que torna este comando muito importante no trabalho com&nbsp;strings. O<strong> strlen(<\/strong>) estritamente calcula o tamanho de uma string, simples assim. Se voc\u00ea tem uma determinada palavra <strong>&#8220;Capivara&#8221;<\/strong> e definir o <strong>strlen(&#8220;Capivara&#8221;)<\/strong>, a fun\u00e7\u00e3o te retornar\u00e1 <strong>8<\/strong>.<\/p>\n\n\n\n<h2>Colocando a m\u00e3o na massa<\/h2>\n\n\n\n<p>Retornando ao c\u00f3digo utilizado pela fun\u00e7\u00e3o Levenshtein, podemos reparar que a mesma pode te retornar sugest\u00f5es nada relevante se todas as suas palavras de compara\u00e7\u00e3o forem completamente diferentes da palavra buscada. Em um primeiro passo, ent\u00e3o pensei, limitando as palavras comparadas a ter um \u00edndice Levenshtein menor que uma determinada porcentagem (no exemplo defini 50%) da palavra digitada, se nenhuma delas tiver pelo menos 50% de semelhan\u00e7a n\u00e3o teremos nenhum retorno de semelhan\u00e7a.<\/p>\n\n\n\n<p>Para isto fiz algumas modifica\u00e7\u00f5es utilizando do comando strlen() ele ser\u00e1 respons\u00e1vel por condicionar o tamanho m\u00e1ximo do \u00edndice Levenshtein e assim adicionar a palavra comparada \u00e0 sugest\u00e3o indicada.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted brush: php; gutter: true\">&lt;?php \nif($_GET){\n    $input = $_GET[word];\n\n    \/\/ Array de palavras \n    $words  = array('DialHost','Hospedagem','Sites','Cloud',\n                    'Computing','Servidores','Brasil','iMasters','PHP');\n\n    \/\/ Inicio uma vari\u00e1vel com a menor encontrada pela busca\n    $sht = strlen(utf8_decode($input))\/2;\n    $print_word='';\n\n    \/\/ Inicio o loop de compara\u00e7\u00e3o das palavras\n    foreach ($words as $word) {\n\n        \/\/Fa\u00e7o a compara\u00e7\u00e3o das dit\u00e2ncias entre a palavra digita e a palavra selecionada no array.\n        $lev = levenshtein($input, $word);\n\n        \/\/ Verifico se a palavra do array \u00e9 igual a palavra digitada.\n        if ($lev == 0) {\n\n            \/\/ Defino a palavra digitada como sendo a palavra final\n            $print_word = $word;\n            $sht = 0;\n\n            \/\/J\u00e1 que a palavra exata j\u00e1 foi encontrada n\u00e3o preciso mais continuar no loop.\n            break;\n        }\n        \/\/ Se a palavra do array n\u00e3o for exata come\u00e7o a comparar se ela \u00e9 mais pr\u00f3xima que a comparada anteriormente.\n        if ($lev &lt;= $sht || $sht &lt; 0) {\n            \/\/ Se der verdadeiro a palavra ser\u00e1 guardada como a palavra final\n            $print_word  = $word;\n            \/\/ E defino o valor levenshtein da palavra como o mais pr\u00f3ximo. Este valor ser\u00e1 utilizado nas compara\u00e7\u00f5es seguintes. \n            $sht = $lev;\n        }\n    }\n?&gt;\n\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted brush: php; gutter: true\">A principal mudan\u00e7a aqui foi na linha 10 do c\u00f3digo onde eu incio a menor entrada pela busca. Com ela estando diferente de \"0\" agora uma palavra para ser considerada uma sugest\u00e3o v\u00e1lida tem que ser pelo menos 50% parecida com a palavra digitada no formul\u00e1rio.\n\nPor fim adiciono o html do formul\u00e1rio.\n\n&lt;!DOCTYPE html&gt;\n&lt;html lang=\"pt-br\"&gt;\n&lt;head&gt;\n&lt;title&gt;Levenshtein&lt;\/title&gt;\n&lt;meta charset=\"utf-8\"&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;?php\necho \"&lt;div style='margin-top:50px;text-align:center;font-family:arial,sans-serif;font-size:1.6em;'&gt;A palavra digitada foi:\".$input.\"&lt;\/div&gt;\";\nif ($sht == 0) {\necho \"&lt;div style='text-align:center;font-family:arial,sans-serif;font-size:1.6em;'&gt;Encontramos a palavra exata para sua busca:\".$print_word.\"&lt;\/div&gt;\";\n} else if ($print_word!='') {\necho \"&lt;div style='line-height:1.7em;text-align:center;font-family:arial,sans-serif;font-size:1.6em;'&gt;Talvez voc\u00ea esteja procurando por:\".$print_word.\"&lt;\/div&gt;\";\n}\nelse{\necho \"&lt;div style='line-height:1.7em;text-align:center;font-family:arial,sans-serif;font-size:1.6em;'&gt;N\u00e3o encontramos palavras que se pare\u00e7am com sua busca&lt;\/div&gt;\";\n}\necho \"&lt;div style='margin-top:50px;text-align:center;font-family:arial,sans-serif;font-size:1.6em;'&gt;&lt;a href='http:\/\/devel2.dialhost.com.br\/Blog-SandBox\/levenshtein.php' title='Fazer outra busca'&gt;Fazer outra busca&lt;\/a&gt;&lt;\/div&gt;\";\n}\nelse {\n?&gt;\n&lt;div style=\"margin-top:50px;text-align:center;font-family:arial,sans-serif;font-size:1em;\"&gt;\n&lt;h1&gt;Apenas um teste com Levenshtein&lt;\/h1&gt;\n&lt;form action=\"levenshtein.php\" method=\"get\" accept-charset=\"utf-8\"&gt;\n&lt;label&gt; Digite a palavra a ser comparada&lt;br&gt;&lt;input style=\"padding:5px;font-size:1.4em;line-height:1.4em;margin-top:5px;\"type=\"text\" name=\"word\" placeholder=\"ex: DialHost\" value=\"\"&gt;&lt;\/label&gt;\n&lt;input type=\"submit\" name=\"buscar\" value=\"Buscar\"&gt;\n&lt;\/form&gt;\n&lt;?php\n}\n?&gt;\n&lt;\/div&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n\n\n\n<p>Acredito que, mesmo assim, n\u00e3o temos uma busca de relev\u00e2ncia digna de Google. Mas, para um simples exemplo esta fun\u00e7\u00e3o pode aumentar bastante a relev\u00e2ncia de suas sugest\u00f5es ou corre\u00e7\u00f5es. <a href=\"http:\/\/www.dialhost.com.br\/blog-sandbox\/levenshtein.php\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (abre numa nova aba)\">Confiram s\u00f3 o exemplo modificado<\/a><\/p>\n\n\n\n<h2>Erro comum<\/h2>\n\n\n\n<p>Na verdade este erro encontrei enquanto pesquisava sobre o assunto e s\u00f3 vale para casos onde a busca possui palavras acentuadas. Ao que tudo indica podem haver conflitos de codifica\u00e7\u00f5es de string quando utilizamos acentua\u00e7\u00e3o. O strlen() acaba por contar caracteres do tipo: \u00e1, \u00e9, \u00ed, como 2 caracteres ao inv\u00e9s de um s\u00f3. Resolver isso \u00e9 muito f\u00e1cil. Basta adicionar a fun\u00e7\u00e3o utf8_decode() junto ao par\u00e2metro. Voc\u00ea pode ver que no exemplo acima eu utilizei este comando para evitar poss\u00edveis erros com acentua\u00e7\u00e3o.<\/p>\n\n\n\n<p>Podemos tamb\u00e9m utilizar a fun\u00e7\u00e3o&nbsp;<strong style=\"color: #373737;\">mb_strlen() <\/strong>que explicarei em post futuro.<\/p>\n\n\n\n<p>Espero que tenham gostado desta dica sobre strlen(). Para o pr\u00f3ximo post explicarei o <a title=\"utf8_decode e utf8_encode tratando com codifica\u00e7\u00e3o Unicode\" href=\"http:\/\/blog.dialhost.com.br\/tecnologia\/utf8_decode-e-utf8_encode-tratando-com-codificacao-unicode\/\" target=\"_blank\" rel=\"noopener noreferrer\">utf8_decode() e utf8_encode()<\/a> e aos que tiverem interesse em buscar por si pr\u00f3prios deixo a dica de lerem um pouco no <a title=\"Manual PHP\" href=\"http:\/\/php.net\/manual\/pt_BR\/\" target=\"_blank\" rel=\"noopener noreferrer\">manual do php<\/a>. Abs, e at\u00e9 a pr\u00f3xima.<\/p>\n\n\n\n<div class=\"publicidade\">\n<div id=\"texto\">Tenha todo o desempenho para o seu site com a Hospedagem Cloud DialHost. Servidores em cloud prontos para receber sites em PHP. <a title=\"Hospedagem Cloud DialHost\" href=\"http:\/\/www.dialhost.com.br\/hospedagem-de-sites\/hospedagem-cloud?utm_source=DialHost&amp;utm_medium=Blog&amp;utm_campaign=Frases_Blog\" target=\"_blank\" rel=\"noopener noreferrer\">Saiba Mais<\/a>.<\/div>\n<\/div>\n\n\n\n<div class=\"clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\t\t\t\tNeste post falarei sobre a fun\u00e7\u00e3o strlen(). Ela j\u00e1 \u00e9 conhecida e pode ser utilizada para finalidades como: validador de uma condi\u00e7\u00e3o, limitar a quantidade de caracteres digtados e limita\u00e7\u00e3o de loops.\t\t\t\t<\/p>\n","protected":false},"author":1,"featured_media":9041,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[24,12],"tags":[76,167,195,197],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v15.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>strlen, desvendando os tamanhos de uma string - Blog DialHost<\/title>\n<meta name=\"description\" content=\"A fun\u00e7\u00e3o strlen() j\u00e1 \u00e9 bem conhecida e pode ser utilizada para finalidades como: validar a entrada em uma condi\u00e7\u00e3o, limita\u00e7\u00e3o de loops e etc.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"strlen, desvendando os tamanhos de uma string - Blog DialHost\" \/>\n<meta property=\"og:description\" content=\"A fun\u00e7\u00e3o strlen() j\u00e1 \u00e9 bem conhecida e pode ser utilizada para finalidades como: validar a entrada em uma condi\u00e7\u00e3o, limita\u00e7\u00e3o de loops e etc.\" \/>\n<meta property=\"og:url\" content=\"\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog DialHost\" \/>\n<meta property=\"article:publisher\" content=\"http:\/\/www.facebook.com\/DialHost\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/DialHost\" \/>\n<meta property=\"article:published_time\" content=\"2015-04-09T17:47:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-05-10T18:46:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2019\/04\/og-image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@dialhost\" \/>\n<meta name=\"twitter:site\" content=\"@dialhost\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\",\"name\":\"DialHost Internet\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/\",\"sameAs\":[\"http:\/\/www.facebook.com\/DialHost\",\"https:\/\/www.instagram.com\/dialhost_oficial\/\",\"https:\/\/www.linkedin.com\/company\/dialhost-internet\",\"https:\/\/www.youtube.com\/channel\/UCAiqiX8IiqTSfA8wQhpzgXQ\",\"https:\/\/twitter.com\/dialhost\"],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#logo\",\"inLanguage\":\"pt-BR\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2019\/03\/marca-dialhost.png\",\"width\":81,\"height\":81,\"caption\":\"DialHost Internet\"},\"image\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#website\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/\",\"name\":\"Blog DialHost\",\"description\":\"Os melhores conte\\u00fados sobre Desenvolvimento Web, Marketing e Neg\\u00f3cios\",\"publisher\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/www.dialhost.com.br\/blog\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2015\/04\/analytics-3088958_1920.jpg\",\"width\":1920,\"height\":1280,\"caption\":\"strlen\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/#webpage\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/\",\"name\":\"strlen, desvendando os tamanhos de uma string - Blog DialHost\",\"isPartOf\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/#primaryimage\"},\"datePublished\":\"2015-04-09T17:47:54+00:00\",\"dateModified\":\"2019-05-10T18:46:47+00:00\",\"description\":\"A fun\\u00e7\\u00e3o strlen() j\\u00e1 \\u00e9 bem conhecida e pode ser utilizada para finalidades como: validar a entrada em uma condi\\u00e7\\u00e3o, limita\\u00e7\\u00e3o de loops e etc.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"\/blog\/\",\"url\":\"\/blog\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/\",\"url\":\"\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/\",\"name\":\"strlen, desvendando os tamanhos de uma string\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/#webpage\"},\"author\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#\/schema\/person\/a0b10cbe35449dea173a06d4664f9fcc\"},\"headline\":\"strlen, desvendando os tamanhos de uma string\",\"datePublished\":\"2015-04-09T17:47:54+00:00\",\"dateModified\":\"2019-05-10T18:46:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/#webpage\"},\"publisher\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/strlen-desvendando-os-tamanhos-de-uma-string\/#primaryimage\"},\"keywords\":\"desenvolvimento,php,Strings,strlen\",\"articleSection\":\"PHP,Tecnologias\",\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#\/schema\/person\/a0b10cbe35449dea173a06d4664f9fcc\",\"name\":\"DialHost Internet\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/05feec2f99aef1c42b09aeaa637ee66f?s=96&r=g\",\"caption\":\"DialHost Internet\"},\"description\":\"H\\u00e1 mais de 18 anos proporcionando um servi\\u00e7o de hospedagem de sites voltado 100% na Experi\\u00eancia e Sucesso do Cliente, prezando a qualidade, transpar\\u00eancia e seguran\\u00e7a.\",\"sameAs\":[\"https:\/\/www.facebook.com\/DialHost\",\"https:\/\/www.instagram.com\/dialhost_oficial\/\",\"https:\/\/www.linkedin.com\/company\/dialhost-internet\",\"https:\/\/twitter.com\/dialhost\",\"https:\/\/www.youtube.com\/channel\/UCAiqiX8IiqTSfA8wQhpzgXQ\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts\/3200"}],"collection":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/comments?post=3200"}],"version-history":[{"count":0,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts\/3200\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/media\/9041"}],"wp:attachment":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/media?parent=3200"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/categories?post=3200"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/tags?post=3200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}