From 0dcba9466d799e566bd0771d869b7bee0d9c3c9c Mon Sep 17 00:00:00 2001 From: Dominique Fournier Date: Thu, 3 Sep 2020 13:35:19 +0000 Subject: [PATCH] fts : Allow to look if a string match against a search string git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@6075 bf3deb0d-5f1a-0410-827f-c0cc1f45334c --- fts.php | 105 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 83 insertions(+), 22 deletions(-) diff --git a/fts.php b/fts.php index d738a6e..ab2735c 100644 --- a/fts.php +++ b/fts.php @@ -6,13 +6,18 @@ /** The Full Text Search * Analyze the provided search text (like a search engine), and create the - * sql query to found the answer. + * sql query to found the answer. It also allow to check if a sentence is valid + * against a searched text * Manage the sentences (enclosed in quotes), or the standalone words, * Manage the non wanted field (beginning by -), * Do not search if the word is smaller than a parameter. */ class fts { + /////////////////////////// + //// PROPERTIES //// + /////////////////////////// + // {{{ /** The minimum length of a token to search */ public $minLength = 3; @@ -29,42 +34,61 @@ class fts /** The regexes created by the parser */ private $regexes = null; + // }}} - /** Get the tokens store after the search - */ - public function getTokens () - { - return $this->tokens; - } - - /** Get the tokens store after the search, without the too small ones - */ - public function getTokensMin () - { - return $this->tokensMin; - } - - /** Get the regexes defined after the analyzer - */ - public function getRegexes () - { - return $this->regexes; - } - + //////////////////////////// + //// CONSTRUCTOR //// + //////////////////////////// /** The constructor check the availability of the MB module */ public function __construct () + // {{{ { if (! function_exists ("mb_strlen")) throw new \Exception ("PHP don't have the MB Support. Please add it !", 500); } + // }}} + //////////////////////// + //// GETTERS //// + //////////////////////// + /** Get the tokens store after the search + */ + public function getTokens () + // {{{ + { + return $this->tokens; + } + // }}} + + /** Get the tokens store after the search, without the too small ones + */ + public function getTokensMin () + // {{{ + { + return $this->tokensMin; + } + // }}} + + /** Get the regexes defined after the analyzer + */ + public function getRegexes () + // {{{ + { + return $this->regexes; + } + // }}} + + ////////////////////////////// + //// PUBLIC METHODS //// + ////////////////////////////// /** Search the text provided in $query in the database * @param string $query The text to found in the database * @return array The operator and the associated regex value to search */ public function search ($query) + // {{{ { $query = trim ($query); $this->tokens = $this->tokenizer ($query); @@ -74,6 +98,32 @@ class fts $this->tokensMin["minuses"]); return $this->regexes; } + // }}} + + /** Return $line if the $query match against $line, or false if not + * @param string $line The line to examine + * @param string $query The query to apply on it + * @return string|false The $line if match, false + */ + public function searchString ($line, $query) + // {{{ + { + $regexes = $this->search ($query); + if (empty ($this->tokens)) + return false; + foreach ($this->tokens["tokens"] as $key => $searchPart) + { + if (trim ($searchPart) === "") + continue; + $match = (strpos ($line, $searchPart) !== false); + if ($this->tokens["minuses"][$key] === "" && $match == 0) + return false; + if ($this->tokens["minuses"][$key] === "-" && $match == 1) + return false; + } + return $line; + } + // }}} /** Search in SQL * @param string $query The text to found in the database @@ -83,6 +133,7 @@ class fts * @return array The result of the query */ public function searchSQL ($query, $dblayeroo, $fields) + // {{{ { $regexes = $this->search ($query); if (empty ($regexes["operator"])) @@ -125,13 +176,18 @@ class fts } return $dbl->execute (); } + // }}} + /////////////////////////////// + //// PRIVATE METHODS //// + /////////////////////////////// /** Create the regex associated to the provided tokens and minuses * @param array $tokens The token list * @param array $minuses The minuses list * @return array The operator and the associated regex value to search */ private function regex ($tokens, $minuses) + // {{{ { if (! is_array ($tokens)) throw new \Exception ("Invalid tokens provided to fts:tokenMinLength", @@ -153,6 +209,7 @@ class fts } return array ("operator"=>$operator, "value"=>$value); } + // }}} /** Remove the tokens with too small length. Remove the not desired minuses * too. @@ -161,6 +218,7 @@ class fts * @return array tokens and minuses */ private function tokenMinLength ($tokens, $minuses) + // {{{ { if (! is_array ($tokens)) throw new \Exception ("Invalid tokens provided to fts:tokenMinLength", @@ -180,12 +238,14 @@ class fts } return array ("tokens"=>$newTokens, "minuses"=>$newMinuses); } + // }}} /** Return an array with the $query tokenized * @param string $query The text to tokenize * @return array tokens and minuses */ private function tokenizer ($query) + // {{{ { if (! is_string ($query)) throw new \Exception ("Invalid query provided to fts:tokenizer", 500); @@ -239,4 +299,5 @@ class fts if ($debug) print_r ($tokens); return array ("tokens"=>$tokens, "minuses"=>$minuses); } + // }}} }