In the case of the last $bfind() in your example, PCRE is interpreting this as: for string "abcdef", search for ^.*f (matching from the beginning of the string), but only return results from position 2 onwards. In this call, the ^*.f will match from position 1 onwards, so PCRE says no match was found.