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;

preferences:
131.71 ms | 404 KiB | 5 Q