{"id":3174,"date":"2015-03-13T15:35:19","date_gmt":"2015-03-13T18:35:19","guid":{"rendered":"http:\/\/blog.dialhost.com.br\/?p=3174"},"modified":"2019-05-10T15:51:29","modified_gmt":"2019-05-10T18:51:29","slug":"levenshtein-tratamento-de-strings-com-php","status":"publish","type":"post","link":"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/","title":{"rendered":"Levenshtein &#8211; Tratamento de strings com PHP"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"700\" height=\"260\" src=\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2019\/05\/tratamento_strings_levenshtein.jpg\" alt=\"\" class=\"wp-image-9043\" srcset=\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2019\/05\/tratamento_strings_levenshtein.jpg 700w, https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2019\/05\/tratamento_strings_levenshtein-300x111.jpg 300w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><figcaption>Sistema de sugest\u00f5es do Google<\/figcaption><\/figure>\n\n\n\n<p>H\u00e1 algum tempo, venho listando alguns temas que sempre achei interessante estudar e entender melhor.&nbsp;Entre eles estava o tratamento de strings com&nbsp;PHP. Resolvi ent\u00e3o, iniciar esta nova s\u00e9rie de postagens para compartilhar algumas fun\u00e7\u00f5es, que podem ser interessantes tratamento de&nbsp;strings.<\/p>\n\n\n\n<p>Para hoje, explico a fun\u00e7\u00e3o Levenshtein. Apesar de pouco usada e comentada nas redes de discuss\u00e3o, a fun\u00e7\u00e3o Levenshtein tem aplica\u00e7\u00f5es que confesso me surpreenderam. Mas, vamos por partes.<\/p>\n\n\n\n<h2>Defini\u00e7\u00e3o da fun\u00e7\u00e3o Levenshtein<\/h2>\n\n\n\n<p>A fun\u00e7\u00e3o \u00e9 respons\u00e1vel por definir a &#8220;dist\u00e2ncia&#8221; entre duas strings, baseada na quantidade de altera\u00e7\u00f5es que a palavra 1 precisa sofrer para virar uma determinada palavra 2. Neste sistema, s\u00e3o consideradas como altera\u00e7\u00f5es: as substitui\u00e7\u00f5es, remo\u00e7\u00f5es e inclus\u00f5es de caracteres. Ao fim da compara\u00e7\u00e3o esta fun\u00e7\u00e3o vai retornar um valor n\u00famerico entre 0 e 255, ou -1 se algum dos argumentos for maior que 255 caracteres.<\/p>\n\n\n\n<h2>Utilizando a fun\u00e7\u00e3o Levenshtein para tratamento de strings<\/h2>\n\n\n\n<p>Ok, acredito que j\u00e1 deu para pelo menos termos uma no\u00e7\u00e3o sobre esta fun\u00e7\u00e3o, ent\u00e3o vamos para a aplica\u00e7\u00e3o. Afinal o que esta fun\u00e7\u00e3o completamente diferente pode fazer por n\u00f3s, meros mortais? Bem, a primeira aplica\u00e7\u00e3o direta que me veio a cabe\u00e7a foi algo muito utilizado para nos ajudar em buscas e edi\u00e7\u00f5es de texto. O famoso corretor ortogr\u00e1fico.<\/p>\n\n\n\n<p>A&nbsp;fun\u00e7\u00e3o \u00e9 respons\u00e1vel por comparar a &#8220;dist\u00e2ncia&#8221; entre duas palavras utilizando a quantidade de altera\u00e7\u00f5es. Sendo assim,&nbsp;chegamos a conclus\u00e3o que de que ela analisa a semelhan\u00e7a entre duas palavras. Com um pouco mais de tratamento e algumas condi\u00e7\u00f5es&nbsp;podemos ent\u00e3o retornar sugest\u00f5es de palavras semelhantes para substituir em seu texto. Ou simplesmente sugerir uma nova busca.<\/p>\n\n\n\n<p>Vamos para o c\u00f3digo ent\u00e3o?<\/p>\n\n\n\n<p>Para utilizar este comando e conseguir sugest\u00f5es relevantes, precisaremos buscar palavras a serem comparadas com a palavra que est\u00e1 sendo digitada. Utilizarei um array de palavras, mas o mesmo pode vir de um resultado de banco de dados ou outra fonte de dados.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted brush: php; gutter: <a href=\">casino online&lt;\/a&gt;  true\"&gt;&amp;lt;?php \nif($_GET){\n $input = $_GET[word];\n\n \/\/ Array de palavras \n $words = array(&amp;#039;DialHost&amp;#039;,&amp;#039;Hospedagem&amp;#039;,&amp;#039;Sites&amp;#039;,&amp;#039;Cloud&amp;#039;,\n &amp;#039;Computing&amp;#039;,&amp;#039;Servidores&amp;#039;,&amp;#039;Brasil&amp;#039;,&amp;#039;iMasters&amp;#039;,&amp;#039;PHP&amp;#039;);\n<\/pre>\n\n\n\n<p>A partir de agora inicio minha busca dentro do array para encontrar uma sugest\u00e3o de palavra semelhante.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted brush: php; gutter: true\">\/\/ Inicio uma vari\u00e1vel com a menor dist\u00e2ncia encontrada pela busca\n$sht = -1;\n\n\/\/ Inicio o loop de compara\u00e7\u00e3o das palavras\nforeach ($words as $word) {\n\n\/\/Fa\u00e7o a compara\u00e7\u00e3o das dist\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.\nif ($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.\nbreak;\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.\nif ($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;<\/pre>\n\n\n\n<p>Por fim criei um html b\u00e1sico para imprimir os resultados da minha busca e o formul\u00e1rio para que eu possa digitar uma nova busca.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted brush: php; gutter: true\">&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{\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}\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><a title=\"Levenshtein - Tratamento de strings com PHP\" href=\"http:\/\/blog.dialhost.com.br\/blog-sandbox\/levenshtein.php\" target=\"_blank\" rel=\"noopener noreferrer\">Veja o exemplo funcionando aqui<\/a>.<\/p>\n\n\n\n<p>Assim podemos conferir como funciona um sistema b\u00e1sico de sugest\u00e3o de palavras ou de corre\u00e7\u00e3o ortogr\u00e1fico.<\/p>\n\n\n\n<p>Apenas para finalizar. Voc\u00eas devem estar questionando que no exemplo a valida\u00e7\u00e3o faz uma busca com baixa relev\u00e2ncia, j\u00e1 que, por menor que seja a similaridade da palavra pesquisada, uma delas ser\u00e1 adicionada no resultado. Para tratar isto podemos criar regras mais complexas de relev\u00e2ncia utilizando strlen(), por exemplo. Mas este comando fica pra um pr\u00f3ximo post da s\u00e9rie.<\/p>\n\n\n\n<p>Espero que esta dica r\u00e1pida tenha ajudado no tratamento. Caso queira aprofundar mais sobre este comando, indico o pr\u00f3prio <a href=\"https:\/\/php.net\/manual\/pt_BR\/function.levenshtein.php\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (abre numa nova aba)\">manual do PHP<\/a>.<\/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\tConhe\u00e7a o comando PHP Levenshtein. A fun\u00e7\u00e3o \u00e9 respons\u00e1vel por comparar a \u201cdist\u00e2ncia\u201d entre duas palavras utilizando a quantidade de altera\u00e7\u00f5es e assim, definir o n\u00edvel de semelhan\u00e7a entre elas.\t\t\t\t<\/p>\n","protected":false},"author":1,"featured_media":9045,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[24,12],"tags":[76,143,167],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v15.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Levenshtein - Tratamento de strings com PHP - Blog DialHost<\/title>\n<meta name=\"description\" content=\"Trate strings com o comando em PHP Levenshtein. A fun\u00e7\u00e3o \u00e9 respons\u00e1vel por comparar a \u201cdist\u00e2ncia\u201d entre duas palavras utilizando a quantidade de altera\u00e7\u00f5es.\" \/>\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\/levenshtein-tratamento-de-strings-com-php\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Levenshtein - Tratamento de strings com PHP - Blog DialHost\" \/>\n<meta property=\"og:description\" content=\"Trate strings com o comando em PHP Levenshtein. A fun\u00e7\u00e3o \u00e9 respons\u00e1vel por comparar a \u201cdist\u00e2ncia\u201d entre duas palavras utilizando a quantidade de altera\u00e7\u00f5es.\" \/>\n<meta property=\"og:url\" content=\"\/blog\/levenshtein-tratamento-de-strings-com-php\/\" \/>\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-03-13T18:35:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-05-10T18:51:29+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\/levenshtein-tratamento-de-strings-com-php\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/wp-content\/uploads\/2015\/03\/lavenshtein.jpg\",\"width\":960,\"height\":640},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/#webpage\",\"url\":\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/\",\"name\":\"Levenshtein - Tratamento de strings com PHP - Blog DialHost\",\"isPartOf\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/#primaryimage\"},\"datePublished\":\"2015-03-13T18:35:19+00:00\",\"dateModified\":\"2019-05-10T18:51:29+00:00\",\"description\":\"Trate strings com o comando em PHP Levenshtein. A fun\\u00e7\\u00e3o \\u00e9 respons\\u00e1vel por comparar a \\u201cdist\\u00e2ncia\\u201d entre duas palavras utilizando a quantidade de altera\\u00e7\\u00f5es.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/#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\/levenshtein-tratamento-de-strings-com-php\/\",\"url\":\"\/blog\/levenshtein-tratamento-de-strings-com-php\/\",\"name\":\"Levenshtein &#8211; Tratamento de strings com PHP\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/#webpage\"},\"author\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#\/schema\/person\/a0b10cbe35449dea173a06d4664f9fcc\"},\"headline\":\"Levenshtein &#8211; Tratamento de strings com PHP\",\"datePublished\":\"2015-03-13T18:35:19+00:00\",\"dateModified\":\"2019-05-10T18:51:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/#webpage\"},\"publisher\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.dialhost.com.br\/blog\/levenshtein-tratamento-de-strings-com-php\/#primaryimage\"},\"keywords\":\"desenvolvimento,Levenshtein,php\",\"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\/3174"}],"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=3174"}],"version-history":[{"count":0,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/posts\/3174\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/media\/9045"}],"wp:attachment":[{"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/media?parent=3174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/categories?post=3174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dialhost.com.br\/blog\/wp-json\/wp\/v2\/tags?post=3174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}