Nose si entendemos mal o entiendo yo mal el problema, la funcion substr_count cuenta el numero de apariciones de una cadena dentro de una subcadena, es decir si tenemos:
Código PHP:
$subcadena = "Esto es una prueba";
$cadena = "es";
echo substr_count($subcadena, $cadena);
Eso te devolveria 1.
El caso es que esa función no sporta espreciones regulares.
La solución sería dividir la cadana segun los <h1>(.*)</h1> y asi tener un array de datos, contar ese array y tendras el número de apariciones

. Serí algo así:
Código PHP:
$array_datos = split("<h1>(.*)</h1>", $cadena);
echo count($array_datos);
De tal manera que te podrias hacer:
Código PHP:
function substr_count_regex($pattern, $cadena)
{
$array_datos = split($pattern ,$cadena);
return count($array_datos);
}
De esa manera indicas en el pattern lo que quieres buscar con el patron que quieras y la cadena