Вы хотите
$str= preg_replace('#([A-Za-z]+)(\d+)#', '$1 $2', $str);
\W
не делает то, что вы думаете; \w
означает «символ слова», а \W
означает « не слово». Поскольку вы конкретно хотите букв , однако, ни то, ни другое не соответствует тому, что вы хотите, и вам нужен [A-Za-z]
, который является классом символов, соответствующим всем буквам. Вам также нужно +
после него, чтобы соответствовать «одному или нескольким».
Скобки - это то, как вы «захватываете» часть выражения для дальнейшего использования; $1
и $2
ссылаются на текст в скобках.