ereg_replace o Il modificatore \e PCRE deprecato ma la funzione preg_replace no. Copia e incolla il messaggio per favore.
No str_replace non funziona con espansione espressioni regolari ma esattamente stringa (non ti serve).
Non c'entra il discorso estensione php o htm se comunque il parser e il motore capisce che è codice, più che altro output. Se l'output è destinato per un browser sarà conforme al markup x/html (cioè i tag) e un tag br non è visibile come carattere ma semplicemente in x/html vuol dire a capo.
Forza aggiungendo un header per visualizzare nel semplice testo
Codice PHP:
header('Content-Type: text/plain; charset=utf-8');
$string = '<h3 class="h3">Piscine</h3>Lorem ipsum'; // stringa senza a capo
$string = nl2br(preg_replace('#</h3>#si', "</h3>\r\n", $string)); // nl2br traduce ogni occorrenza di \r\n o \n\r o \n o \r senza rimuovere a capo e aggiunge il tag br
echo($string); // dopo il titolo tag h3 output con "\r\n" e tag br, se servito in x/html si vedrà a capo del tag br , mentre per vedere esattamente il codice sorgente per il <br /> impostare header a text/plain.
$string = $string . '<h3 class="h3">Camere</h3>Lorem ipsum'; // sovrascrivere la variabile $string, tag h3 e descrizione senza a capo
Invece per php il mime_type predefinito potrebbe essere html, che sarebbe così
Codice PHP:
header('Content-Type: text/html; charset=utf-8');
Prima di html 5 era consone dichiarare una dtd ecco cosa vuol dire validare (X)HTML https://www.html.it/pag/15846/validare-lxhtml/
Mentre in html 5 il minimo possibile (altrimenti non è markup html valido)
codice HTML:
<!DOCTYPE html>
<html>
<head>
<title>An HTML standard template</title>
<meta charset="utf-8" />
</head>
<body>
<p>… Your HTML content here …</p>
</body>
</html>
Tag br html5 https://www.w3.org/TR/2011/WD-html5-...r-element.html