Skip to content

Commit 23c35af

Browse files
committed
Review of #4202, Rolled out to other searches, added testing
1 parent 78fecdf commit 23c35af

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

app/Search/SearchRunner.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ protected function buildQuery(SearchOptions $searchOpts, Entity $entityModelInst
173173
// Handle exact term matching
174174
foreach ($searchOpts->exacts as $inputTerm) {
175175
$entityQuery->where(function (EloquentBuilder $query) use ($inputTerm, $entityModelInstance) {
176+
$inputTerm = str_replace('\\', '\\\\', $inputTerm);
176177
$query->where('name', 'like', '%' . $inputTerm . '%')
177178
->orWhere($entityModelInstance->textField, 'like', '%' . $inputTerm . '%');
178179
});
@@ -218,7 +219,7 @@ protected function applyTermSearch(EloquentBuilder $entityQuery, SearchOptions $
218219
$subQuery->where('entity_type', '=', $entity->getMorphClass());
219220
$subQuery->where(function (Builder $query) use ($terms) {
220221
foreach ($terms as $inputTerm) {
221-
$inputTerm = (strpos($inputTerm, "\\") !== false) ? str_replace("\\", "\\\\", $inputTerm) : $inputTerm;
222+
$inputTerm = str_replace('\\', '\\\\', $inputTerm);
222223
$query->orWhere('term', 'like', $inputTerm . '%');
223224
}
224225
});
@@ -355,6 +356,9 @@ protected function applyTagSearch(EloquentBuilder $query, string $tagTerm): Eloq
355356
$tagValue = (float) trim($connection->getPdo()->quote($tagValue), "'");
356357
$query->whereRaw("value {$tagOperator} {$tagValue}");
357358
} else {
359+
if ($tagOperator === 'like') {
360+
$tagValue = str_replace('\\', '\\\\', $tagValue);
361+
}
358362
$query->where('value', $tagOperator, $tagValue);
359363
}
360364
} else {

tests/Entity/EntitySearchTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,26 @@ public function test_words_adjacent_to_lines_breaks_can_be_matched_with_normal_t
444444
$search->assertSee($page->getUrl(), false);
445445
}
446446

447+
public function test_backslashes_can_be_searched_upon()
448+
{
449+
$page = $this->entities->newPage(['name' => 'TermA', 'html' => '
450+
<p>More info is at the path \\\\cat\\dog\\badger</p>
451+
']);
452+
$page->tags()->save(new Tag(['name' => '\\Category', 'value' => '\\animals\\fluffy']));
453+
454+
$search = $this->asEditor()->get('/search?term=' . urlencode('\\\\cat\\dog'));
455+
$search->assertSee($page->getUrl(), false);
456+
457+
$search = $this->asEditor()->get('/search?term=' . urlencode('"\\dog\\"'));
458+
$search->assertSee($page->getUrl(), false);
459+
460+
$search = $this->asEditor()->get('/search?term=' . urlencode('"\\badger\\"'));
461+
$search->assertDontSee($page->getUrl(), false);
462+
463+
$search = $this->asEditor()->get('/search?term=' . urlencode('[\\Categorylike%\\fluffy]'));
464+
$search->assertSee($page->getUrl(), false);
465+
}
466+
447467
public function test_searches_with_user_filters_adds_them_into_advanced_search_form()
448468
{
449469
$resp = $this->asEditor()->get('/search?term=' . urlencode('test {updated_by:dan} {created_by:dan}'));

0 commit comments

Comments
 (0)