^[\p{L}\p{N}.,_-]*$
будет соответствовать строке, содержащей только буквы (Unicode), цифры или «специальные символы», которые вы упомянули. [...]
- это класс символов , что означает «один из символов, содержащихся здесь». Вам нужно использовать модификатор Unicode /u
, чтобы это работало:
preg_match(`/^[\p{L}\p{N}.,_-]*$/u', $mystring);
Если вас интересуют только буквы ASCII, проще:
^[\w.,-]*$
или в PHP:
preg_match(`/^[\w.,-]*$/', $mystring);