Regex допускает только 1 символ

$rex = '/^[^<,"@?=>|;#]$/i'; 

У меня возникают проблемы с этим регулярным выражением. Идея состоит в том, что поля ввода проверяются для определенных символов, и если они присутствуют, выдайте ошибку.

Это регулярное выражение бросает ошибки для каждой строки длиной более 1 символа. Может ли кто-нибудь сказать мне, что я делаю неправильно?

EDIT: Люди говорят, что не видят, что я хочу делать с этим регулярным выражением. Я хочу отказаться от ввода, если один из следующих символов является частью введенной строки:

<>, "@? = |; #

EDIT2: «действительное» регулярное выражение JG делает трюк.

У вас есть $ после вашего выражения и ^ в начале, что означает, что вы принимаете ровно один символ.

EDIT (на основе комментариев):

Вы можете попытаться выяснить, имеют ли ваши поля ввода только допустимые символы, сопоставляя их с этим (если они совпадают, это означает, что нет недопустимых символов):

 $rex = '/^[^<,"@$?=>|;#]+$/i' 

Вы также можете сделать обратное, то есть проверить, имеют ли ваши поля ввода какие- либо недопустимые символы, используя регулярное выражение, предоставляемое хаосом:

 $rex = '/[<,"@$?=>|;#]/'; 

Таким образом, если регулярное выражение совпадает, значит, у вас есть недопустимые символы.

Вероятно, вам действительно нужно:

 $rex = '/[<,"@$?=>|;#]/'; 

Тогда ваш случай ошибки, когда это регулярное выражение совпадает, а не когда оно этого не делает.

Это эквивалентно тому, что вы делаете с этим небольшим изменением в вашем регулярном выражении:

 $rex = '/^[^<,"@?=>|;#]*$/i'; 

Впрочем, это неслучайно перекомплектовано. Как пытаться выяснить, есть ли в комнате слон, подсчитав, сколько вещей в комнате не слоны, то посмотрите, совпадает ли это число с количеством вещей в комнате. (И модификатор /i не может в любой момент выполнить что-либо.)

Вы просите только одного персонажа. Если вам нужно несколько символов, повторите шаблон, как это (один или несколько раз):

  $rex = '/^[^<,"@?=>|;#]+$/i'; 

или как это (ноль или более):

  $rex = '/^[^<,"@?=>|;#]*$/i'; 

Вы захотите '/^[^<,"@$?=>|;#]+$/i' или '/^[^<,"@$?=>|;#]*$/i' .

Например:

 $valid = 'Hello'; $invalid = 'h<i'; $regex = '/^[^<,"@$?=>|;#]+$/i'; print "'$valid' gives ".preg_match($regex, $valid)."\n"; print "'$invalid' gives ".preg_match($regex, $invalid)."\n"; 

Какие результаты:

 'Hello' gives 1 'h<i' gives 0 

Я просто сделал ваше выражение и добавил + или * после вашей группы персонажей.

В регулярных выражениях * означает совпадение 0 или более случаев, а + означает совпадение 1 или более.

Поскольку ^ означает начало строки и $ end, без символа + или *, вы указываете, что она соответствует строке, состоит из ровно одного вхождения неспециального символа, поэтому почему это ошибки, если ваша строка длиннее одной персонаж.

Если вы хотите, вы также можете удалить i в конце выражения, так как вам не нужно делать нечувствительность к регистру, если в выражении не участвуют буквы.

Дополнительные сведения о регулярных выражениях см . В разделе Regular-Expressions.info .

^ означает начало строки
$ означает конец строки
[] означает соответствие одного из группы символов

Вы будете сопоставлять строки, содержащие один и только один из этих списков.

возможно "/(.*?)[^<,"@$?=>|;#]/i" или " /^[^<,"@$?=>|;#].*+$/i"

не знаю точно, что вы пытаетесь сделать