diff options
| author | 2023-01-09 12:59:09 +0100 | |
|---|---|---|
| committer | 2023-01-09 12:59:09 +0100 | |
| commit | 3fb8ab8eb5c88042320bbe006825b21f5a8f21de (patch) | |
| tree | 3c7412d44bae45f4678cb5db3192ab22db58f2f7 | |
| parent | b5a418ec1618cb1a058aee3dd47baa63562c9194 (diff) | |
Handling of parentheses as special characters in searches (#4989)
#fix https://github.com/FreshRSS/FreshRSS/issues/4987
| -rw-r--r-- | app/Models/BooleanSearch.php | 8 | ||||
| -rw-r--r-- | docs/en/users/03_Main_view.md | 2 | ||||
| -rw-r--r-- | docs/fr/users/03_Main_view.md | 2 | ||||
| -rw-r--r-- | tests/app/Models/SearchTest.php | 5 |
4 files changed, 14 insertions, 3 deletions
diff --git a/app/Models/BooleanSearch.php b/app/Models/BooleanSearch.php index b1c7bbd3b..279040a5a 100644 --- a/app/Models/BooleanSearch.php +++ b/app/Models/BooleanSearch.php @@ -118,8 +118,9 @@ class FreshRSS_BooleanSearch { $nextOperator = 'AND'; while ($i < $length) { $c = $input[$i]; + $backslashed = $i >= 1 ? $input[$i - 1] === '\\' : false; - if ($c === '(') { + if ($c === '(' && !$backslashed) { $hasParenthesis = true; $before = trim($before); @@ -164,11 +165,12 @@ class FreshRSS_BooleanSearch { $i++; while ($i < $length) { $c = $input[$i]; - if ($c === '(') { + $backslashed = $input[$i - 1] === '\\'; + if ($c === '(' && !$backslashed) { // One nested level deeper $parentheses++; $sub .= $c; - } elseif ($c === ')') { + } elseif ($c === ')' && !$backslashed) { $parentheses--; if ($parentheses === 0) { // Found the matching closing parenthesis diff --git a/docs/en/users/03_Main_view.md b/docs/en/users/03_Main_view.md index eb8fe0f01..d940774f5 100644 --- a/docs/en/users/03_Main_view.md +++ b/docs/en/users/03_Main_view.md @@ -247,6 +247,8 @@ Finally, parentheses may be used to express more complex queries, with basic neg * `(author:Alice intitle:hello) !(author:Bob intitle:world)` * `!(S:1 OR S:2)` +> ℹ️ If you need to search for a parenthesis, it needs to be escaped like `\(` or `\)` + ### By sorting by date You can change the sort order by clicking the toggle button available in the header. diff --git a/docs/fr/users/03_Main_view.md b/docs/fr/users/03_Main_view.md index 3a65c1f7f..3ca3b907c 100644 --- a/docs/fr/users/03_Main_view.md +++ b/docs/fr/users/03_Main_view.md @@ -275,3 +275,5 @@ Enfin, les parenthèses peuvent être utilisées pour des expressions plus compl * `!((author:Alice intitle:bonjour) OR (author:Bob intitle:monde))` * `(author:Alice intitle:bonjour) !(author:Bob intitle:monde)` * `!(S:1 OR S:2)` + +> ℹ️ Si vous devez chercher une parenthèse, elle doit être *échappée* comme suit : `\(` ou `\)` diff --git a/tests/app/Models/SearchTest.php b/tests/app/Models/SearchTest.php index fe686e7ba..52c10244d 100644 --- a/tests/app/Models/SearchTest.php +++ b/tests/app/Models/SearchTest.php @@ -339,6 +339,11 @@ class SearchTest extends PHPUnit\Framework\TestCase { '(author:Alice intitle:hello) !(author:Bob intitle:world)', ' ((e.author LIKE ? AND e.title LIKE ? )) AND NOT ((e.author LIKE ? AND e.title LIKE ? )) ', ['%Alice%', '%hello%', '%Bob%', '%world%'], + ], + [ + 'intitle:"\\(test\\)"', + '(e.title LIKE ? )', + ['%\\(test\\)%'], ] ]; } |
