Jeśli już obrabiasz sam tekst (bez znaczników html), to regex będzie w porządku (w zasadzie będzie jedynym sensownym rozwiązaniem). Ale jeśli zmieniasz ten tekst w np. całym kodzie strony, to już najpierw warto dobrać się do kodu html za pomocą np. DOMDocument i w nim szukać tego konkretnego węzła z tekstem i po znalezieniu zmieniać jego zawartość.
Tu masz coś, co może zadziałać, dopasuj wedle potrzeby. Nie przetwarzaj tym całego kodu strony, bo może się zrobić galimatias. Porób sobie var_dump() w różnych miejscach, gdy nie jest jasne co się wzięło skąd.
$text = 'Jakiś tam tekst z linkiem <a href="http://link.do.wideo/wideo.mp4" target="_blank">http://link.do.wideo/wideo.mp4</a> - koniec';
$replace = function(string $name) : string
{
return '
<div class="video">
<video class="video" controls poster="./vid/' . $name . '.jpg">
<source src="./vid/' . $name . '.mp4" type="video/mp4">
</video>
</div>
';
};
foreach ($matches[1] as $k => $match) {
$text = str_replace($match, $replace($matches[2
][$k]), $text); }