A ver, no se mucho de expresiones regulares, pero voy a tratar de plantearte una solucion usando otros métodos...
Código PHP:
<?
// Aquí tenemos la cadena a modificar:
$cadena = "primer txt en negrita,
<img src=\"http://www.google.com/txt.jpg\">
segundo txt
<a href=\"http://www.google.com/txt.jpg\">enlace</a>
tercer txt";
// Ahora hacemos un explode de la siguiente manera:
$partes = explode(' txt', $cadena);
// De esta forma separamos la cadena en los trozos dividos
// por ' txt', nótese que al principio tiene un espacio para
// asegurarnos de que lo que agarre sea una palabra y no
// esté incluido dentro de ningún tipo de link.
// Ahora hacemos un implode así:
$nueva_cadena = implode(' <span>txt</span>', $partes);
echo $nueva_cadena
?>
Bueno, es medio rudimentaria, pero puede servirte, claro, tiene varias "vulnerabilidades", por decirlo asi, por ejemplo que haya una palabra que sea: "txtarea-etc..." esto te dará como resultado: "<span>txt</span>area-etc..."
O que por ejemplo, la palabra txt sea la primera de la cadena, entonces no la agarrará el script, porque como dije antes, se coloca un espacio antes para asegurarse que no sea ningún tipo de link, y al ser la primera palabra, no tiene espacio antes...