I had a similar task last week. This is how I solved it (simplified):
<?php
use App\Models\Figure;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Str;
Route::get('/', function () {
$contentget = <<<HTML
<p>Some text goes here, lorem ipsum lorem ipsum</p>
[Figures 10]
HTML;
$results = preg_match_all('/\[Figures (\d+)]/', $contentget, $matches);
if ($results === false || $results === 0) {
return $contentget;
}
[$placeholders, $figureids] = $matches;
$figures = Figure::query()
->whereKey($figureids)
->get();
if ($figures->isEmpty()) {
return $contentget;
}
foreach ($placeholders as $index => $placeholder) {
$figure = $figures->find($figureids[$index] ?? 0);
if ($figure) {
$content = Str::of('<img src="##URL##" alt="##ALT##" class="img-responsive"><p>##TEXT##<p>')
->replace('##URL##', $figure->url)
->replace('##ALT##', $figure->text)
->replace('##TEXT##', $figure->text);
$contentget = str_replace($placeholder, $content, $contentget);
}
}
return $contentget;
});
Hope this helps!