Тире следует экранировать, и двойная кавычка не обязательна. Как ни странно, вам нужно в четыре раза избежать обратной косой черты перед точкой с запятой. В противном случае это интерпретируется как если бы вы избегали точки с запятой и игнорировались. *
'/^[a-z0-9#&()\-\\\\;,.\'" ]+$/i'
Вы также можете поместить неэкранированную черту в начале класса персонажа, хотя это немного неясно и может на мгновение сбить с толку кого-то, кто не знает об этой опции. Это работает, потому что тире в начале не может быть частью допустимого диапазона символов, поэтому это может быть только буквальный тире.
'/^[-a-z0-9#&()\\\\;,.\'" ]+$/i'
* \\\\;
уменьшено до \\;
PHP до того, как механизм регулярных выражений увидит его. Затем механизм регулярных выражений уменьшает \\;
до \;
. Таким образом, четыре обратные косые черты! Единственная обратная косая черта \;
становится просто ;
. То же самое относится к \\;
- PHP уменьшает его до \;
, а затем механизм регулярных выражений интерпретирует \;
как простую точку с запятой ;
. Подойдет не менее четырех. †
† На самом деле я солгал. Вы можете уйти с тремя обратными слешами. Но затем вы немного злоупотребляете снисходительностью парсера PHP. Четверо определенно лучше.