A different approach:
$len = strlen(preg_replace('/(.*?'.preg_quote($needle,'/').')?.*/', '$1', $haystack));
Probably slower and more memory-intensive, but it does require less typing. So whether or not it's actually a shortcut depends on the definition. It does present a valid option if you're allergic to ternary operators and assignment within evaluation conditions.
You could also do
$len = preg_match('/'.preg_quote($needle,'/').'()/', $haystack, $m, PREG_OFFSET_CAPTURE)? $m[1][1] : 0
although again it's a bit wasteful of resources to be using preg_ functions to search for fixed strings.