preg_match_all('~<.+?>(.*?)<\/.+?>~', $str, $matches);
$result = $matches[1];
или, без регулярных выражений:
function getTexts($domNode) {
$result = [];
foreach ($domNode->childNodes as $n) {
if ($n->nodeType === XML_TEXT_NODE) {
$result[] = $n->nodeValue;
} else if ($n->nodeType === XML_ELEMENT_NODE) {
array_push($result, ...getTexts($n));
}
}
return $result;
}
$doc = new DOMDocument();
$doc->loadHTML($str);
$result = getTexts($doc);
или, тоже без регулярных выражений:
$doc = new DOMDocument();
$doc->loadHTML($str);
$result = [];
foreach ((new DOMXPath($doc))->query('//text()') as $n) {
$result[] = $n->nodeValue;
}