2015-03-20 3 views
0

Мое регулярное выражение производит true, когда оно должно быть ложным. Я пробовал этот пример, используя онлайн-валидаторы регулярных выражений, и он всегда отвергается, за исключением моего кода. Я делаю что-то неправильно?preg_match() оценивает мое регулярное выражение взамен

$name = "1NTH"; 
preg_match("/[A-Z][A-Z][A-Z][A-Z]?/",$name); 

Этот точный пример оценивается как истинный.

+0

Я узнал, что онлайн-валидаторы могут вести себя иначе, чем те, которые вы используете. – watery

+0

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

ответ

1

Вы получаете правильное поведение, так как вы просите трех заглавных букв, а затем четвертый.

Вы, вероятно, хотите использовать это регулярное выражение:

/^[A-Z][A-Z][A-Z][A-Z]?$/ 

(обратите внимание на ^, начало линии, и $ конец строки), как это явно требует, чтобы прописные буквы должны быть все содержание текста линия.

+0

Это сделало это. Онлайн-ресурс, который я использовал, был частью курса CS в моем университете и, к сожалению, автоматически добавлялся в^и $. Благодаря! –

0

PHP Manual Согласно наблюдениям:

preg_match() возвращает значение 1, если шаблон соответствует данному предмету, 0, если это не так, или FALSE, если произошла ошибка.

В вашем примере должно быть 3 обязательных и 1 необязательная прописная буква. Итак, матч должен.

1

Это потому, что это правда. Он содержит [A-Z] символов.

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

^[A-Z][A-Z][A-Z][A-Z]?$ 
1

стандартной PHP регулярные проверки выражений, если строка содержит шаблон, и является не точное совпадение. Это отличается, например, стандартным механизмом регулярных выражений Java.

Вы должны использовать ^ и $, которые соответствуют соответственно началу и концу строки. Оба значения: zero-length assertions.

$name = "1NTH"; 
preg_match("/^[A-Z]{3}[A-Z]?$/", $name); 

PS: Я оптимизировали регулярное выражение с помощью квантора {3}, который соответствует три последующих вхождений предыдущего символа или группы.

0

Как сказал stribizhev, ваше регулярное выражение совпадает с запросом более трех букв, найденных в $ name. Я предполагаю, что вы хотите отклонить «1NTH», потому что он начинается с цифры. Это означает, что вам нужно добавить якорь «с самого начала» (\A). Кроме того, 3 повторных [A-Z] можно суммировать, добавив счетчик повторов. Таким образом, все заявление должно быть: \A[A-Z]{3,}

1

Нет ничего плохого в вашем регулярном выражении. Он действителен на основании указанного вами правила.

Давайте сделаем это один шаг за один раз:

  1. [A-Z] означает совпадение ровно 1 заглавными буквами алфавита.

  2. [A-Z]? означает, соответствует либо 0, либо 1 алфавит верхнего регистра.

Посмотрите, что происходит? Если нет, переходите.

  1. [A-Z][A-Z][A-Z] означает соответствие точно 3 верхним регистровым алфавитам. (1 для каждого правила [A-Z])

  2. [A-Z][A-Z][A-Z][A-Z]? означает, что первые три символа должны быть в верхнем регистре. Последний может быть либо 0, либо 1 алфавит верхнего регистра.

В вашем примере, 1NTH содержит ровно три верхних алфавитов случае, что является правильным. Вы не вводили никаких ограничений на то, должен ли он содержать номер или нет, будь то до или после 3 алфавитов. И последние [A-Z]?? Ну, это необязательно, правда? (См 2 правило #)

+0

Также, как упоминал @MC Emperor в своем ответе, ваше регулярное выражение может быть оптимизировано. Но это еще одна история :) – Sutandiono

0

Вы дали, как это,

$name = "1NTH"; 
preg_match("/[A-Z][A-Z][A-Z][A-Z]?/",$name); 

В вашем коде некоторые измените это ниже код

$name = "1NTH"; 
preg_match("/[A-Z][A-Z][A-Z][A-Z]?$/",$name); 

вы пропустили «$» в конце препрега строки ,

Я проверил и отлично работает с вашим требованием.

Посмотрите эту ссылку, и вы также проверите один раз по этой ссылке. Click Here

Смежные вопросы