{"id":457,"date":"2023-04-21T04:47:04","date_gmt":"2023-04-21T04:47:04","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=457"},"modified":"2023-04-21T04:47:05","modified_gmt":"2023-04-21T04:47:05","slug":"php-strtok-recortando-strings-delimitadas-por-caracter","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2023\/04\/21\/php-strtok-recortando-strings-delimitadas-por-caracter\/","title":{"rendered":"PHP strtok Recortando Strings Delimitadas por Caracter"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>$email = 'user.name@mocked.mail';\n$user = strtok($email,'@');\nvar_dump($user); \/\/user.name\n\n$domain = strtok('');\nvar_dump($domain); \/\/mocked.mail<\/code><\/pre>\n\n\n\n<p>H\u00e1 algum tempo atr\u00e1s trabalhei em um projeto que lidava com importa\u00e7\u00e3o de dados e a sanitiza\u00e7\u00e3o era um processo imprescind\u00edvel. Ent\u00e3o me deparei com um comando muito curioso que eu n\u00e3o conhecia at\u00e9 ent\u00e3o, o <strong>strtok<\/strong>.<\/p>\n\n\n\n<p>Na sanitiza\u00e7\u00e3o de email \u00e9 bastante fact\u00edvel subdividir a string principal em usu\u00e1rio e dom\u00ednio, ent\u00e3o ao inv\u00e9s de recorrer ao tradicional <strong>explode<\/strong> eu parti em busca de um novo recurso, algo mais pr\u00e1tico.<\/p>\n\n\n\n<p>Apliquei este comando especialmente em testes unit\u00e1rios combinados com o recurso <strong>DataProvider<\/strong>. <\/p>\n\n\n\n<p>Veja como \u00e9 simples conseguir o primeiro nome e sobrenome em dois <strong>hits<\/strong> apenas.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$email = 'first-name.last-name@mocked.mail';\n$first = strtok(strtok($email,'@'),'.');\nvar_dump($first); \/\/first-name\n\n$last = strtok('');\nvar_dump($last); \/\/last-name<\/code><\/pre>\n\n\n\n<p>Entenda como strtok realmente funciona. Ao informar o caracter delimitador a <strong>tokeniza\u00e7\u00e3o<\/strong> \u00e9 <strong>buferizada<\/strong> e o primeiro elemento \u00e9 disponibilizado e o restante da string permanece no <strong>buffer<\/strong>, mas sem ter sido particionada.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$csv = 'column1;column2;column3;column4;column5';\n$first = strtok($csv, ';');\nvar_dump($first); \/\/column1\n\n$remainder = strtok('');\nvar_dump($remainder); \/\/column2;column3;column4;column5<\/code><\/pre>\n\n\n\n<p>Para alcan\u00e7ar todos os elementos na cadeia \u00e9 necess\u00e1rio ir particionando o conte\u00fado restante que se encontra no <strong>buffer<\/strong>, para isto basta informar apenas o delimitador na <strong>tokeniza\u00e7\u00e3o<\/strong>. Observe o c\u00f3digo abaixo que demonstra um <strong>loop<\/strong> at\u00e9 que o retorno seja (<strong>bool<\/strong>)<strong>FALSE<\/strong> indicando que n\u00e3o existem mais elementos no <strong>buffer<\/strong>;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$csv = 'column1;column2;column3;column4;column5';\n$token = strtok($csv, ';');\n\nwhile ($token !== false) {\n  echo $token.\"\\n\";\n  $token = strtok(';');\n}<\/code><\/pre>\n\n\n\n<p>Observe tamb\u00e9m que voc\u00ea pode utilizar m\u00faltiplos delimitadores no processamento e n\u00e3o h\u00e1 uma ordem que precise ser respeitada. A cada ciclo, ao encontrar qualquer um dos caracteres delimitadores o primeiro elemento \u00e9 imediatamente retornado e o restante permanece no <strong>buffer<\/strong> at\u00e9 que ocorra o exaurimento completo do <strong>buffer<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$csv = 'column1;column2-column3|column4\/column5';\n$token = strtok($csv, '|-\/;');\n\nwhile ($token !== false) {\n  echo $token.\"\\n\";\n  $token = strtok('-|;\/');\n}<\/code><\/pre>\n\n\n\n<p>Agora voc\u00ea j\u00e1 sabe, precisou quebrar uma string?<\/p>\n\n\n\n<p>Vai de strtok!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>H\u00e1 algum tempo atr\u00e1s trabalhei em um projeto que lidava com importa\u00e7\u00e3o de dados e a sanitiza\u00e7\u00e3o era um processo imprescind\u00edvel. Ent\u00e3o me deparei com um comando muito curioso que eu n\u00e3o conhecia at\u00e9 ent\u00e3o, o strtok. Na sanitiza\u00e7\u00e3o de email \u00e9 bastante fact\u00edvel subdividir a string principal em usu\u00e1rio e dom\u00ednio, ent\u00e3o 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":[226,224,120,223,222,225],"class_list":["post-457","post","type-post","status-publish","format-standard","hentry","category-backend","category-coding","category-php","tag-domain","tag-email","tag-explode","tag-split","tag-strtok","tag-user"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/457","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=457"}],"version-history":[{"count":1,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/457\/revisions"}],"predecessor-version":[{"id":458,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/457\/revisions\/458"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}