$STATENAME) { $$STATENAME = pow(2,$INDEX); debug_this($STATENAME . " = " . $$STATENAME . "\n"); } debug_this("\$WAIT = $WAIT\n"); $ERRORS = array(); $escape = -1; $context = array(); $criteria = array(); $quote = $item = $scope = ""; setState($state,($pre_quote_state = $WAIT),__LINE__); $str .= " "; foreach (str_split($str) as $index => $value) { if ($state > $QUOTE) setState($state,$WAIT,__LINE__); if(preg_match("/\s/",$value)){ BBranch('WHITESPACE',$state,$value,__LINE__); if($state == $ITEM) { if (is_escaped($escape,$index)) $item .= $value; else { add_to_current_criteria($criteria,"",__LINE__); if(count($scope)) add_and_reset_scope($context,$scope,$criteria); setState($state,$WAIT,__LINE__); } } elseif($state == $QUOTE) { add_to_current_criteria($criteria,$value); } elseif($state == $SCOPE) { if($default_scope != ""){ add_new_criteria($criteria,$scope); add_and_reset_scope($context,$default_scope,$criteria); setState($state,$WAIT,__LINE__); } else add_and_reset_scope($context,$scope); setState($state,$WAIT,__LINE__); } } elseif(preg_match("/[\:\=]/",$value)) { BBranch('EQUIV',$state,$value,__LINE__); if($state == $SCOPE && strlen($scope)) { //add_and_reset_scope($context,$scope); setState($state,$CRITERIA,__LINE__); } elseif($state & ( $ITEM | $QUOTE )) add_to_current_criteria($criteria,$value); } elseif(strstr("\\",$value)){ BBranch('ESCAPE',$state,$value,__LINE__); if (! is_escaped($escape,$index)) $escape = $index; else { if($state & ( $ITEM | $QUOTE )) { add_to_current_criteria($criteria,$value); } if($state & $CRITERIA) { add_new_criteria($criteria,$value); setState($state,$ITEM); } } } elseif(strstr(",",$value)){ BBranch('COMMA',$state,$value,__LINE__); if($state == $ITEM) { setState($state,$CRITERIA,__LINE__); } elseif($state == $SCOPE) { add_new_criteria($criteria,$scope); if($default_scope != ""){ $scope = $default_scope; setState($state,$CRITERIA,__LINE__); } else { add_and_reset_scope($context,$scope = null,$criteria); $ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED "; setState($state,$WAIT,__LINE__); } } elseif($state & ( $CRITERIA | $WAIT)) $ERRORS[] = "UNEXPECTED T_COMMA ENCOUNTERED "; } elseif(preg_match("/[\"']/",$value)){ BBranch('QUOTE',$state,$value,__LINE__); if($state == $QUOTE){ debug_this("IS QUOTE ESCAPED: " . ((is_escaped($escape,$index)) ? "YES" : "NO") . "\n"); if ($value == $quote && !is_escaped($escape,$index)) { setState($state,$pre_quote_state,__LINE__); $quote = ""; } elseif($pre_quote_state & ( $CRITERIA | $ITEM)) { add_to_current_criteria($criteria,$value); } elseif($pre_quote_state & ( $WAIT | $SCOPE )) { $scope .= $value; } } elseif($state & ( $WAIT | $CRITERIA )) { $pre_quote_state = $state; $quote = $value; setState($state,$QUOTE,__LINE__); } } else { BBranch('WORD',$state,$value,__LINE__); if($state == $WAIT) { setState($state,$SCOPE,__LINE__); $scope = $value; } elseif($state == $SCOPE) $scope .= $value; elseif ($state == $CRITERIA) { setState($state,$ITEM,__LINE__); add_new_criteria($criteria,$value); } elseif ($state == $ITEM) add_to_current_criteria($criteria,$value); elseif($state == $QUOTE){ if($pre_quote_state == $WAIT){ $pre_quote_state = $SCOPE; $scope = $value; } elseif($pre_quote_state == $CRITERIA) { $pre_quote_state = $ITEM; add_new_criteria($criteria,$value); } else { add_to_current_criteria($criteria,$value); } } } } return $context; } function interpret($arr){ $str = ""; $str = print_r($arr,true); return $str; } $strs = array( "file:hello.fa start:0 end:1322251", "file:hello.fa group:\"wild dogs\"", "file:hello.fa group:\"12 angry men\" group:\"11 'angry' men\"", "file:hello.fa group:\"12 angry men\",\"11 \\\"angry\\\" men\"" ); foreach ($strs as $search){ echo $search . ":\n " . str_replace("\n", "\n\t", interpret(parse($search))). "\n"; }