<?php

        $string = "Boa __tarde__ **Bacco**, isto é um **teste** com diversos **negritos** e __sublinha_dos__

		__**um** dois__  **__um__ dois**
		__aqui nao_funciona __ __ nem_aqui,pois está errado__
		__aqui está certo__ ___errado__ __ce  rto__";

		preg_match_all("/(.?)(\*\*([^\*\s]+\s*\*?)*[^\s\*]+\*\*)([^\*]|$)/", $string, $resultNegrito);
		
		$negrito = $resultNegrito[2];
		$iniNegrito = $resultNegrito[1]; // valores do grupo (.?)
		for($x = 0; $x < count($negrito); $x++){
			if($iniNegrito[$x] != "*"){
				$res = "<b>".substr($negrito[$x],2,strlen($negrito[$x]) -4)."</b>";
				$string = str_replace($negrito[$x],$res,$string);
			}
		}

		preg_match_all("/(.?)(__([^_\s]+\s*_?)*[^\s_]+__)([^_]|$)/", $string, $resultSublinhado);

	   $sublinhado = $resultSublinhado[2];
		$iniSublinhado = $resultSublinhado[1]; // valores do grupo (.?)
		for($x = 0; $x < count($sublinhado); $x++){
			if($iniSublinhado[$x] != "_"){
				$res = "<u>".substr($sublinhado[$x],2,strlen($sublinhado[$x]) -4)."</u>";
				$string = str_replace($sublinhado[$x],$res,$string);
			}
		}

		echo $string;