$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"
не знаю точно, что вы пытаетесь сделать