Во-первых, fclose писать обязательно;
Во-вторых, у вас есть пустой элемент из-за '!', который стоит в упор слову. Cоответственно создается пустой файл .html.
В вашем случае должно быть preg_split("/[\W_]/u", $i, -1, PREG_SPLIT_NO_EMPTY)
Экранировать выражение нужно всегда - /регулярка/.
Флаг /u для того чтобы корректно распознавались русские буквы, в противном случае они будут попадать под \W, как non-word characters.