2009-08-15 4 views
2
$rex = '/^[^<,"@?=>|;#]$/i'; 

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

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

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

<>, "@ = |; #

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

ответ

5

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

EDIT (на основе комм Энты):

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

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

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

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

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

+0

Так что удаление $ должно делать трюк? – KdgDev

+0

Возможно, вы захотите удалить как ^, так и $. Если вы удалите $ при сохранении ^, вы будете соответствовать только одному из символов в начале выражения. –

+0

Удаление как ^, так и $ означает, что он будет проверять любую строку, если он содержит допустимый символ и, следовательно, не является тем, что необходимо. –

1

Вы хотите, чтобы '/^[^<,"@$?=>|;#]+$/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.

+0

Теперь ничего не найдено. Никакой символ на моей клавиатуре не дает соответствия. – KdgDev

+0

Это кажется мне довольно странным. Я отредактирую в примере, который работает для меня. –

0

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

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

+0

Так что мне придется избегать знака доллара посередине? – KdgDev

+0

Нет, так что вам нужно квалифицировать набор, чтобы задать кратность. Положите либо +, либо * после того, как вы выбрали исключение, чтобы сказать, что хотите один или более или нуль или больше, соответственно. – hughdbrown

2

То, что вы, вероятно, на самом деле нужно:

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

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

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

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

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

0

может быть "/(.*?)[^<,"@$?=>|;#]/i" или "/^[^<,"@$?=>|;#].*+$/i"

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

+0

Все эти случайные символы - это символы, которые я хочу запретить. Если появится один из них, вход будет отклонен. Если нет, вход принимается. – KdgDev

1

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

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

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

$rex = '/^[^<,"@?=>|;#]*$/i'; 
Смежные вопросы