Другой подход:
$len = strlen(preg_replace('/(.*?'.preg_quote($needle,'/').')?.*/', '$1', $haystack));
Возможно, медленнее и требует больше памяти, но для этого требуется меньше печатать. Так что, действительно ли это ярлык, зависит от определения. Это действительно допустимый вариант, если у вас аллергия на троичных операторов и назначение в условиях оценки.
Вы также можете сделать
$len = preg_match('/'.preg_quote($needle,'/').'()/', $haystack, $m, PREG_OFFSET_CAPTURE)? $m[1][1] : 0
хотя опять же это немного расточительно - использовать функции preg_ для поиска фиксированных строк.