foreach ($terms as $key => $term) {
$term = htmlentities($term, ENT_QUOTES);
$term = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $term);
- if (preg_match('/\s/', $term)) {
+ if (preg_match('/".*?"/', $term)) {
+ $term = str_replace('"', '', $term);
$exactTerms[] = '%' . $term . '%';
$term = '"' . $term . '"';
} else {
return $search->orderBy($orderBy, 'desc');
}
-
+
}
* @param $termString
* @return array
*/
- protected function prepareSearchTerms($termString)
+ public function prepareSearchTerms($termString)
{
$termString = $this->cleanSearchTermString($termString);
- preg_match_all('/"(.*?)"/', $termString, $matches);
+ preg_match_all('/(".*?")/', $termString, $matches);
+ $terms = [];
if (count($matches[1]) > 0) {
- $terms = $matches[1];
+ foreach ($matches[1] as $match) {
+ $terms[] = $match;
+ }
$termString = trim(preg_replace('/"(.*?)"/', '', $termString));
- } else {
- $terms = [];
}
if (!empty($termString)) $terms = array_merge($terms, explode(' ', $termString));
return $terms;
->see('Chapter Search Results')->seeInElement('.entity-list', $chapter->name);
}
+ public function test_search_quote_term_preparation()
+ {
+ $termString = '"192" cat "dog hat"';
+ $repo = $this->app[\BookStack\Repos\EntityRepo::class];
+ $preparedTerms = $repo->prepareSearchTerms($termString);
+ $this->assertTrue($preparedTerms === ['"192"','"dog hat"', 'cat']);
+ }
+
public function test_books_search_listing()
{
$book = \BookStack\Book::all()->last();