note 91532 added to function.strtok

From: Date: Mon, 15 Jun 2009 16:37:27 +0000
Subject: note 91532 added to function.strtok
Groups: php.notes 
Request: Send a blank email to php-notes+get-156900@lists.php.net to get a copy of this message
Here is a small function I wrote as I needed to extract some named tokens from a string (a la Google). For example, I needed to format a string like "extension:gif size:64M animated:true author:'John Bash'" into array( 'extension' => 'gif', 'size' => '64M', 'animated' => true, 'author' => 'John Bash' ) So, here's the code: <?php header('Content-type: text/plain; charset=utf-8'); /** * NOTE : use mbstring.func_overload for multi-byte support with this function * * @param string $string the string to tokenize * @param int $offset the starting offset * @param string $defaultTokenName the default token name if none specified * @param string $groupDelimiters the characters to delimit token groups * @param string $groupNameDelimiter the character(s) to delimit token group names * @return array */ function getTokens( $string, $offset = 0, $defaultTokenName = null, $groupDelimiters = '\'"', $groupNameDelimiter = ':') { if ($offset >= strlen($string)) { //echo "offset out of range"; return false; } $spaces = " \t\n\r"; // space characters // add group delimiters to spaces... $groupSpaces = $spaces . $groupNameDelimiter; $delimiters = $groupSpaces . $groupDelimiters; //var_dump($groupSpaces); $string = ltrim(substr($string, $offset), $groupSpaces); $token_strings = array(); //echo "String is : " . $string . "\n"; // 1. split all tokens... while ($offset < strlen($string)) { $lastOffset = $offset; $escaped = false; if (false !== strpos($groupDelimiters, $char = $string[$offset])) { $groupChar = $char; } else { $groupChar = null; } if (null !== $groupChar) { while (($offset < strlen($string)) && (($groupChar !== ($char = $string[++$offset])) || $escaped)) { //$offset++; $escaped = ('\\' === $char); } $offset++; //echo "*** Grouped : " . substr($string, $lastOffset, $offset - $lastOffset) . "\n"; } else { while (($offset < strlen($string)) && ((false === strpos($delimiters, $char = $string[$offset])) || $escaped)) { $offset++; $escaped = ('\\' === $char); } //echo "*** Non-group : " . substr($string, $lastOffset, $offset - $lastOffset) . "\n"; } //skip spaces... while (($offset < strlen($string)) && ((false !== strpos($groupSpaces, $char = $string[$offset])) || $escaped)) { $offset++; $escaped = ('\\' === $char); } $token_strings[] = substr($string, $lastOffset, $offset - $lastOffset); //echo "Next token = '" . end($token_strings) . "'\n"; } $tokens = array(); $tokenName = null; foreach ($token_strings as $token_str) { // clean $token_str $token_str = trim(stripslashes($token_str), $spaces); $str_value = trim($token_str, $delimiters); switch (strtolower($str_value)) { case 'true': $str_value = true; break; case 'false': $str_value = false; break; default: break; } // is it a token name? if (':' === substr($token_str, -1, 1)) { if (!empty($tokenName)) { $tokens[$tokenName] = ''; } $tokenName = trim($token_str, $delimiters); } else { if (!empty($tokenName)) { if (isset($tokens[$tokenName])) { $tokens[$tokenName] = array( $tokens[$tokenName], $str_value ); } else { $tokens[$tokenName] = $str_value; } $tokenName = null; } elseif (empty($defaultTokenName)) { $tokens[] = trim($token_str, $delimiters);; } else { if (isset($tokens[$defaultTokenName])) { $tokens[$defaultTokenName] = array( $tokens[$defaultTokenName], $str_value ); } else { $tokens[$defaultTokenName] = $str_value; } } } } if (!empty($tokenName)) { $tokens[$tokenName] = ''; } return $tokens; } $str = "check1: test " . "check2:'hello world' " . 'check3: "foo" ' . "check4: \\\"try this\\\"" . '"buz" ' . 'check1:true'; ?> ---- Server IP: 72.55.140.6 Probable Submitter: 132.211.218.140 ---- Manual Page -- http://www.php.net/manual/en/function.strtok.php Edit -- https://master.php.net/note/edit/91532 Del: integrated -- https://master.php.net/note/delete/91532/integrated Del: useless -- https://master.php.net/note/delete/91532/useless Del: bad code -- https://master.php.net/note/delete/91532/bad+code Del: spam -- https://master.php.net/note/delete/91532/spam Del: non-english -- https://master.php.net/note/delete/91532/non-english Del: in docs -- https://master.php.net/note/delete/91532/in+docs Del: other reasons-- https://master.php.net/note/delete/91532 Reject -- https://master.php.net/note/reject/91532 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#156900) next »