diff options
| author | 2022-08-16 10:56:07 +0200 | |
|---|---|---|
| committer | 2022-08-16 10:56:07 +0200 | |
| commit | e27eb1ca9198119ea1b0bd79be5f1aead45d615a (patch) | |
| tree | fd4e2767ab4d65a68b437d77f57b9e6274a65b9d /app/Models/BooleanSearch.php | |
| parent | 8587efa62189a30e3e47075739382d52ecc34cb6 (diff) | |
Basic support for negative searches with parentheses (#4503)
* Basic support for negative searches with parentheses
* `!((author:Alice intitle:hello) OR (author:Bob intitle:world))`
* `(author:Alice intitle:hello) !(author:Bob intitle:world)`
* `!(S:1 OR S:2)`
* Minor documentation / comment
* Remove syslog debug line
Diffstat (limited to 'app/Models/BooleanSearch.php')
| -rw-r--r-- | app/Models/BooleanSearch.php | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/app/Models/BooleanSearch.php b/app/Models/BooleanSearch.php index 332757556..b1c7bbd3b 100644 --- a/app/Models/BooleanSearch.php +++ b/app/Models/BooleanSearch.php @@ -10,7 +10,7 @@ class FreshRSS_BooleanSearch { /** @var array<FreshRSS_BooleanSearch|FreshRSS_Search> */ private $searches = array(); - /** @var string 'AND' or 'OR' */ + /** @var string 'AND' or 'OR' or 'AND NOT' */ private $operator; public function __construct(string $input, int $level = 0, $operator = 'AND') { @@ -123,7 +123,20 @@ class FreshRSS_BooleanSearch { $hasParenthesis = true; $before = trim($before); - if (preg_match('/\bOR$/i', $before)) { + if (preg_match('/[!-]$/i', $before)) { + // Trim trailing negation + $before = substr($before, 0, -1); + + // The text prior to the negation is a BooleanSearch + $searchBefore = new FreshRSS_BooleanSearch($before, $level + 1, $nextOperator); + if (count($searchBefore->searches()) > 0) { + $this->searches[] = $searchBefore; + } + $before = ''; + + // The next BooleanSearch will have to be combined with AND NOT instead of default AND + $nextOperator = 'AND NOT'; + } elseif (preg_match('/\bOR$/i', $before)) { // Trim trailing OR $before = substr($before, 0, -2); |
