Должен ли я использовать ^ и $ в проверке шаблона входного регулярного выражения html5? - PullRequest
12 голосов
/ 04 февраля 2012

Я видел в основном примеры без символов ^ (диафрагма) и $ (валюта или доллар) для обозначения начала и конца соответствующей строки. Однако я не нашел ничего относительно этого в спецификации html5.Являются ли они неявными в шаблоне? Спецификация html5 утверждает, что они неявные.

Когда регулярное выражение скомпилированного шаблона сопоставляется со строкой, его начало должно быть привязано к началу строки, а егоконец привязан к концу строки.Это подразумевает, что язык регулярных выражений, используемый для этого атрибута, такой же, как и в JavaScript, за исключением того, что атрибут pattern сопоставляется со всем значением, а не только с любым подмножеством (в некоторой степени, как если бы оно подразумевало ^ (?: в начале)шаблона и а) $ в конце).

На входах type = "text" шаблон работает нормально, используя любой формат, однако на входах type = "tel" мне пришлось удалить символы длярегулярное выражение для работы, как ожидалось.Я тестировал в Opera и Firefox.

Это ошибка браузера?Должен ли я сообщать об ошибке в bugzilla и т. Д .?


Редактировать: Кажется, я наткнулся на странную ошибку, потому что не могу создать уменьшенный тестовый пример,Простой ввод на странице не показывает поведение, указанное выше.Однако вопрос остается.Должен ли я или не должен использовать проклятые ^ и $ якоря?

Ответы [ 3 ]

4 голосов
/ 07 декабря 2018

В разделе HTML-стандарта по атрибуту pattern все еще говорится, что он всегда привязан в начале и в конце, как уже было указано в вопросе:

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

Мы можем использовать простой тестовый фрагмент для подтверждения этого поведения:

<form>
  <input required pattern="abc">
  <button>Submit</button>
</form>

Вы заметите, что в приведенной выше форме отклоняются значения foo abc и abc foo; будет принята только строка abc. Это показывает, что pattern="abc" эквивалентно pattern="^abc$" и что вам не нужно явно указывать ^ и $.

Насколько я могу судить, конкурирующий ответ , здесь утверждающий, что браузеры использовали для реализации другое поведение, в нарушение спецификации, является полностью ложным. Вы можете скачать Firefox 15 с https://ftp.mozilla.org/pub/firefox/releases/15.0/win32/en-GB/ и самостоятельно протестировать приведенный выше фрагмент кода, и вы увидите, что поведение точно такое же, как в современном браузере. Или, поскольку вы, вероятно, не можете быть обеспокоены, вы можете посмотреть на этот снимок экрана, на котором я делаю это для вас:

Screenshot of this answer in Firefox 15 showing the form above rejecting input of

1 голос
/ 25 сентября 2012

Согласно стандарту, регулярное выражение привязывается в начале и конце . Тем не менее, на практике (проверено FF 15 и Chrome 21) он закрепляется только при запуске!

Поэтому, если вы хотите быть совместимыми как со стандартом, так и с реальностью, вы должны явно привязать свое регулярное выражение к $ Использовать ли ^ также зависит от вас - не обязательно.

0 голосов
/ 04 февраля 2012

Конечно, вы знаете, что номера телефонов бывают разных форм,

, например

  • , находясь в Вене, Австрия, набрав "4000", вы подключитесь к Ратуша.
  • находясь в Инсбруке, Австрия, вам нужно набрать "014000", чтобы набрать номер в мэрии Вены
  • находясь в Нью-Йорке, США, вам нужно набрать +4314000, чтобы набрать тот же номер.

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

Теперь регулярное выражение с обоими якорями ^ и $ будет соответствовать только номеру телефона, если он указан точно в одной форме. С помощью только якоря $ он будет надежно соответствовать одному и тому же номеру телефона, если не указан другой добавочный номер. Без привязки, т. Е. Удаление ^ и $ будет совпадать независимо от кодов местоположения и расширений, но приведет к ненадежности:

Использование «4000» в качестве шаблона для Венской мэрии будет соответствовать «4000», «014000» и «+4314000», но также будет соответствовать «+44140001», что является немецким банком.

...