From f83de5f8342ca2038371bcb2d0545014a37e0508 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Thu, 25 Aug 2016 17:17:26 +0100 Subject: [PATCH] Fixed single word quoted search terms Fixes #170 --- app/Entity.php | 5 +++-- app/Repos/EntityRepo.php | 11 ++++++----- tests/Entity/EntitySearchTest.php | 8 ++++++++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/Entity.php b/app/Entity.php index 1342c2997..496d20a33 100644 --- a/app/Entity.php +++ b/app/Entity.php @@ -167,7 +167,8 @@ class Entity extends Ownable 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 { @@ -206,5 +207,5 @@ class Entity extends Ownable return $search->orderBy($orderBy, 'desc'); } - + } diff --git a/app/Repos/EntityRepo.php b/app/Repos/EntityRepo.php index 012a64967..28f4c0ae8 100644 --- a/app/Repos/EntityRepo.php +++ b/app/Repos/EntityRepo.php @@ -168,15 +168,16 @@ class EntityRepo * @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; diff --git a/tests/Entity/EntitySearchTest.php b/tests/Entity/EntitySearchTest.php index a9d9bc047..8adfd35a3 100644 --- a/tests/Entity/EntitySearchTest.php +++ b/tests/Entity/EntitySearchTest.php @@ -76,6 +76,14 @@ class EntitySearchTest extends TestCase ->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();