Способ годится для поиска в однобайтовых строках:
preg_match('/\d/', 'ddsfsfsdfsdf sad 111 222 333 444', $matches, PREG_OFFSET_CAPTURE);
var_dump($matches);
/*
array(1) {
[0]=>
array(2) {
[0]=>
string(1) "1"
[1]=>
int(17)
}
}
*/
PREG_OFFSET_CAPTURE
В случае, если этот флаг указан, для каждой найденной подстроки будет указана ее позиция (в байтах) в исходной строке. Необходимо помнить, что этот флаг меняет формат возвращаемого массива matches в массив, каждый элемент которого содержит массив, содержащий в индексе с номером 0 найденную подстроку, а смещение этой подстроки в параметре subject - в индексе 1.
php.net