documentContent = $documentContent; $this->info = $info; } public function execute() { $searchResult = $this->search(); return $this->displace($searchResult); } /** * * @return mixed * @throws \Exception */ protected function search() { $searcher = new Searcher($this->info['searchers'], $this->documentContent); return $searcher->execute(); } protected function displace($searchResult) { $replacementIndexes = []; $replacements = []; foreach ($this->info['searchers'] as $searcher) { $replacements[$searcher['key']] = $searcher['replace_with']; } $searchers = []; foreach ($searchResult as $searcher => $searcherResults) { $replacementIndexes[$searcher] = []; foreach ($searcherResults as $searcherResult) { $searchers[$searcherResult['start']] = array_merge($searcherResult, [ 'searcher' => $searcher ]); } } ksort($searchers); $updatedDocumentContent = ''; $currentIndex = 0; foreach ($searchers as $start => $searcherItem) { $partialContent = substr($this->documentContent, $currentIndex, $searcherItem['start'] - $currentIndex); $updatedDocumentContent = $updatedDocumentContent . $partialContent; $start = strlen($updatedDocumentContent); $updatedDocumentContent = $updatedDocumentContent . $replacements[$searcherItem['searcher']]; $end = strlen($updatedDocumentContent) - 1; if ($start <= $end) { $replacementIndexes[$searcherItem['searcher']][] = [ 'start' => $start, 'end' => $end, ]; } $currentIndex = $searcherItem['end'] + 1; } if ($currentIndex < strlen($this->documentContent) - 1) { $updatedDocumentContent = $updatedDocumentContent . substr($this->documentContent, $currentIndex); } return [ 'content' => $updatedDocumentContent, 'indexes' => $replacementIndexes, ]; } }