note 91532 added to function.strtok
| From: | yanick dot rochon at gmail dot com | 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