By using [^0-9]+
you are actually matching the numbers and splitting on them, which leaves you with an empty array element instead of the expected result. You can use a workaround to do this.
print_r(preg_split('/\d+\K/', '12345hello'));
# Array ([0] => 12345 [1] => hello)
The \K
verb tells the engine to drop whatever it has matched so far from the match to be returned.
If you want to consistently do this with larger text, you need multiple lookarounds.
print_r(preg_split('/(?<=\D)(?=\d)|\d+\K/', '12345hello6789foo123bar'));
# Array ([0] => 12345 [1] => hello [2] => 6789 [3] => foo [4] => 123 [5] => bar)