Es algo complejo el tema de bbcodes para incrustar códigos. Si conviertes a entidades html antes de pasar el texto por la función que va a colorear el codigo, entonces tendrás un coloreado incorrecto (como el que obtienes). Si lo haces después, arruinarás el coloreado.
Una solución "rápida" es codificar TODO el texto a entidades html antes de procesar los bbcodes (tal y como lo estas haciendo), y cuando se trate de procesar el código, decodificar primero SÓLO el bloque correspondiente al código y luego colorear. En tu caso, antes de usar
highlight_string() en tu función phpcojecolor(), usar
htmlspecialchars_decode() o
html_entity_decode() para regresar el código a su versión original.