aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2023-01-09 12:59:09 +0100
committerGravatar GitHub <noreply@github.com> 2023-01-09 12:59:09 +0100
commit3fb8ab8eb5c88042320bbe006825b21f5a8f21de (patch)
tree3c7412d44bae45f4678cb5db3192ab22db58f2f7
parentb5a418ec1618cb1a058aee3dd47baa63562c9194 (diff)
Handling of parentheses as special characters in searches (#4989)
#fix https://github.com/FreshRSS/FreshRSS/issues/4987
-rw-r--r--app/Models/BooleanSearch.php8
-rw-r--r--docs/en/users/03_Main_view.md2
-rw-r--r--docs/fr/users/03_Main_view.md2
-rw-r--r--tests/app/Models/SearchTest.php5
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\\)%'],
]
];
}