It sounds like you are trying to build a full text search string,
perhaps for searching a MySQL database? Below is the function I came
up with a while ago. It's worked fine, although it currently does not
check for multiple spaces, but that should be easy to change. It uses
a space as a delimiter and it checks for quotes for searching on
phrases. It returns the search string for a MySQL full text boolean
mode search. You should be able to easily adapt it to your specific
needs.
function prepFullTextSearch($searchVal) {
//Split words into list
$word_List = explode(' ',stripslashes(trim
($searchVal)));
//Step through word list to get search phrases
$i = 0;
$isPhrase = false;
foreach($word_List as $word) {
$searchItems[$i] = trim(($isPhrase?$searchItems[$i].'
'.$word:$word));
//Check for start of Phrase
if(substr($searchItems[$i],0,1) == '"') {
$isPhrase = true;
}
//If not building a phrase, append wildcard (*) to end
of word
if(!$isPhrase) {
$searchItems[$i] .= '*';
$i++;
}
//Check for end of Phrase
if(substr($searchItems[$i],-1) == '"') {
$isPhrase = false;
$i++;
}
}
$searchVal = '+'.implode(' +',$searchItems);
return $searchVal;
}
On Sep 7, 2005, at 10:54 AM, Paul Groves wrote:
I want to be able to break up a number of search terms typed into
an input
box into array, simple enough one would think, just use explode, e.g
$array = explode(" ", $string);
But what if I want to be able to cope with search terms seperated
by > 1
space (a common typing error)? This should work:
function enhanced_explode($string) {
$array = preg_split ("/\s+/", $string);
return ($array);
}
But what if I want to allow "Google"-type search parameters, so that
something like the following is split into 3 search terms?:
firstsearchterm "second search term" thirdsearchterm
The following code will do the trick, but is slow and doesn't allow
for
multiple spaces as the delimiter, nor the possibility of multiple
delimiters
(e.g. " ", "+", "," etc.)
function explode2($delimeter, $string)
{
for ($i = 0; $i < strlen($string); $i++)
{
if ($string{$i} == '"')
{
if ($insidequotes)
$insidequotes = false;
else
$insidequotes = true;
}
elseif ($string{$i} == $delimeter)
{
if ($insidequotes)
{
$currentelement .= $string{$i};
}
else
{
$returnarray[$elementcount++] = $currentelement;
$currentelement = '';
}
}
else
{
$currentelement .= $string{$i};
}
}
$returnarray[$elementcount++] = $currentelement;
return $returnarray;
}
None of these solutions are ideal, I guess a clever regular exression
(preg_split) could solve this, but I'm not quite sure how - does
anyone have
any ideas? Thanks
Paul
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
--
Brent Baisley
Systems Architect
Landover Associates, Inc.
Search & Advisory Services for Advanced Technology Environments
p: 212.759.6400/800.759.0577
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php