3v4l.org

run code in 300+ PHP versions simultaneously
<?php $sentence = '[html style="font-size: 18px;" dir="ltr"][div style="font-size: 18px;" dir="ltr"][p style="font-weight: bold;"]Hello,[/p][p]You have got a new message from [a href="https://www.example.com/"]Example.com[/a][br][br].You could check your message on [a href="https://www.example.com/en/manager/inbox.html"]Manager[/a][/p][p][img src="https://www.example.com/assets/images/logo-default-120x50.png" width="120px" height="80px"][div style="color: #D4192D; font-weight: bold;"]Example.com Team[/div][/p][/div][/html]'; // proceed to the replacement of all self-closing tags first $result = preg_replace('~\[ (br|hr|img)\b ([^]]*) ]~xi', '<$1$2/>', $sentence); // then replace the innermost tags until there's nothing to replace $count = 0; do { $result = preg_replace('~ \[ ( (\w+) [^]]* ) ] # opening tag ( [^[]*+ ) # content without other bracketed tags \[/ \2 ] # closing tag ~xi', '<$1>$3</$2>', $result, -1, $count); } while ($count); echo $result;
Output for 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.27, 8.2.0 - 8.2.17, 8.3.0 - 8.3.4
<html style="font-size: 18px;" dir="ltr"><div style="font-size: 18px;" dir="ltr"><p style="font-weight: bold;">Hello,</p><p>You have got a new message from <a href="https://www.example.com/">Example.com</a><br/><br/>.You could check your message on <a href="https://www.example.com/en/manager/inbox.html">Manager</a></p><p><img src="https://www.example.com/assets/images/logo-default-120x50.png" width="120px" height="80px"/><div style="color: #D4192D; font-weight: bold;">Example.com Team</div></p></div></html>

preferences:
131.64 ms | 403 KiB | 152 Q