question:1109131242

すでにご存じかもしれませんが

preg_match('/[^\w\-.]/', $str)

がtrueのときは「$strに使っても良い文字*以外*が存在する」という意味です。

preg_match('/^[-.\w]*$/', $str)

であれば、「$strが使って良い文字*だけ*で構成されている」となります。

※ []内でも、先頭に置けばハイフンへの\エスケープは不要です。