$text = '<p>Ехал <span>Грека</span> через <a href="#">реку</a></p> а это не изменится';
$doc = new DomDocument('1.0', 'utf-8');
$doc->loadXML('<?xml version="1.0" encoding="utf-8"?><body>' . $text . '</body>');
$xpath = new DomXPath($doc);
$elements = $xpath->query('//p//text()');
foreach ($elements as $tn) {
$tn->nodeValue = mb_strtoupper($tn->nodeValue);
}
echo mb_substr($doc->saveXML($doc->getElementsByTagName('body')->item(0)), 6, -7);
/* На выходе:
* <p>ЕХАЛ <span>ГРЕКА</span> ЧЕРЕЗ <a href="#">РЕКУ</a></p> а это не изменится
*/