diff options
Diffstat (limited to 'app/Models')
| -rw-r--r-- | app/Models/BooleanSearch.php | 15 | ||||
| -rw-r--r-- | app/Models/Search.php | 1 |
2 files changed, 16 insertions, 0 deletions
diff --git a/app/Models/BooleanSearch.php b/app/Models/BooleanSearch.php index 10c2321fb..749dbdfa5 100644 --- a/app/Models/BooleanSearch.php +++ b/app/Models/BooleanSearch.php @@ -37,6 +37,7 @@ class FreshRSS_BooleanSearch { if ($level === 0) { $input = $this->parseUserQueryNames($input, $allowUserQueries); $input = $this->parseUserQueryIds($input, $allowUserQueries); + $input = self::escapeRegexParentheses($input); $input = trim($input); } @@ -133,6 +134,20 @@ class FreshRSS_BooleanSearch { } /** + * Temporarily escape parentheses used in regex expressions. + */ + public static function escapeRegexParentheses(string $input): string { + return preg_replace_callback('#(?<=[\\s(:!-]|^)(?<![\\\\])/.*?(?<!\\\\)/[im]*#', + fn(array $matches): string => str_replace(['(', ')'], ['\\u0028', '\\u0029'], $matches[0]), + $input + ) ?? ''; + } + + public static function unescapeRegexParentheses(string $input): string { + return str_replace(['\\u0028', '\\u0029'], ['(', ')'], $input); + } + + /** * Example: 'ab cd OR ef OR "gh ij"' becomes '(ab cd) OR (ef) OR ("gh ij")' */ public static function addOrParentheses(string $input): string { diff --git a/app/Models/Search.php b/app/Models/Search.php index 0e2f5da6f..45fa742be 100644 --- a/app/Models/Search.php +++ b/app/Models/Search.php @@ -94,6 +94,7 @@ class FreshRSS_Search { public function __construct(string $input) { $input = self::cleanSearch($input); $input = self::unescape($input); + $input = FreshRSS_BooleanSearch::unescapeRegexParentheses($input); $this->raw_input = $input; $input = $this->parseNotEntryIds($input); |
