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']; } $updatedDocumentContent = ''; $currentIndex = 0; foreach ($searchResult as $searcher => $searcherResults) { $replacementIndexes[$searcher] = []; foreach ($searcherResults as $searcherResult) { $partialContent = substr($this->documentContent, $currentIndex, $searcherResult['start'] - $currentIndex); $updatedDocumentContent = $updatedDocumentContent . $partialContent; $start = strlen($updatedDocumentContent); $updatedDocumentContent = $updatedDocumentContent . $replacements[$searcher]; $end = strlen($updatedDocumentContent) - 1; if ($start <= $end) { $replacementIndexes[$searcher][] = [ 'start' => $start, 'end' => $end, ]; } $currentIndex = $searcherResult['end'] + 1; } } if ($currentIndex < strlen($this->documentContent) - 1) { $updatedDocumentContent = $updatedDocumentContent . substr($this->documentContent, $currentIndex); } return [ 'content' => $updatedDocumentContent, 'indexes' => $replacementIndexes, ]; } }