Revision: 43628
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at March 28, 2011 11:52 by jenolan
Initial Code
<?php
/**
* Parses a String of Tags
*
* Tags are space delimited. Either single or double quotes mark a phrase.
* Odd quotes will cause everything on their right to reflect as one single
* tag or phrase. All white-space within a phrase is converted to single
* space characters. Quotes burried within tags are ignored! Duplicate tags
* are ignored, even duplicate phrases that are equivalent.
*
* Returns an array of tags.
*/
function ParseTagString($sTagString)
{
$arTags = array(); // Array of Output
$cPhraseQuote = null; // Record of the quote that opened the current phrase
$sPhrase = null; // Temp storage for the current phrase we are building
// Define some constants
static $sTokens = "
\t"; // Space, Return, Newline, Tab
static $sQuotes = "'\""; // Single and Double Quotes
// Start the State Machine
do
{
// Get the next token, which may be the first
$sToken = isset($sToken)? strtok($sTokens) : strtok($sTagString, $sTokens);
// Are there more tokens?
if ($sToken === false)
{
// Ensure that the last phrase is marked as ended
$cPhraseQuote = null;
}
else
{
// Are we within a phrase or not?
if ($cPhraseQuote !== null)
{
// Will the current token end the phrase?
if (substr($sToken, -1, 1) === $cPhraseQuote)
{
// Trim the last character and add to the current phrase, with a single leading space if necessary
if (strlen($sToken) > 1) $sPhrase .= ((strlen($sPhrase) > 0)? ' ' : null) . substr($sToken, 0, -1);
$cPhraseQuote = null;
}
else
{
// If not, add the token to the phrase, with a single leading space if necessary
$sPhrase .= ((strlen($sPhrase) > 0)? ' ' : null) . $sToken;
}
}
else
{
// Will the current token start a phrase?
if (strpos($sQuotes, $sToken[0]) !== false)
{
// Will the current token end the phrase?
if ((strlen($sToken) > 1) && ($sToken[0] === substr($sToken, -1, 1)))
{
// The current token begins AND ends the phrase, trim the quotes
$sPhrase = substr($sToken, 1, -1);
}
else
{
// Remove the leading quote
$sPhrase = substr($sToken, 1);
$cPhraseQuote = $sToken[0];
}
}
else
$sPhrase = $sToken;
}
}
// If, at this point, we are not within a phrase, the prepared phrase is complete and can be added to the array
if (($cPhraseQuote === null) && ($sPhrase != null))
{
$sPhrase = strtolower($sPhrase);
if (!in_array($sPhrase, $arTags)) $arTags[] = $sPhrase;
$sPhrase = null;
}
}
while ($sToken !== false); // Stop when we receive FALSE from strtok()
return $arTags;
}
Initial URL
Initial Description
Initial Title
Parse phrases from string
Initial Tags
Initial Language
PHP