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

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

The compiled pattern regular expression, when matched against a string, must have its start anchored to the start of the string and its end anchored to the end of the string. This implies that the regular expression language used for this attribute is the same as that used in JavaScript, except that the pattern attribute is matched against the entire value, not just any subset (somewhat as if it implied a ^(?: at the start of the pattern and a )$ at the end).

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

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


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


person Marco Luglio    schedule 04.02.2012    source источник
comment
developer.mozilla.org/en/HTML/Forms_in_HTML упоминает об этом во входных данных tel: Разрывы строк автоматически удаляются из входного значения, но никакой другой синтаксис не применяется, поскольку телефонные номера в разных странах сильно различаются. Вы можете использовать такие атрибуты, как шаблон и максимальная длина, чтобы ограничить значения, вводимые в элементе управления.. Он не упоминает ничего конкретного о типе tel в описании атрибута pattern.   -  person The Nail    schedule 04.02.2012
comment
На самом деле, если я проверю с помощью Firefox, я не вижу никакого странного поведения во входных данных tel. Не могли бы вы привести полный пример, включая код, что вы ожидали и что получили вместо этого?   -  person The Nail    schedule 04.02.2012
comment
Да, я только что заметил это и добавил правку к вопросу. Моя форма немного сложна для размещения здесь, но я посмотрю, что я могу сделать.   -  person Marco Luglio    schedule 04.02.2012
comment
Можете ли вы хотя бы опубликовать точный код элемента input, к которому он относится? И, пожалуйста, предоставьте ссылку, после чего вы ссылаетесь на спецификацию (надеюсь, она взята с W3.org)   -  person The Nail    schedule 04.02.2012
comment
И, как указано в спецификации W3, подразумеваются ^ и $. Это означает, что вам не нужно помещать их туда явно.   -  person The Nail    schedule 04.02.2012
comment
На самом деле я взял его из черновика спецификации whatwg, но он есть и в черновике w3c: w3.org/TR/html5/   -  person Marco Luglio    schedule 05.02.2012
comment
Но то, что всем нравится знать: есть баг или нет? Пожалуйста, покажите несколько примеров, иначе я отмечу этот вопрос как «РЕШЕНО - НЕ ВОСПРОИЗВОДИМО» :-)   -  person The Nail    schedule 05.02.2012
comment
Изолированный ввод = тел ведет себя так, как ожидалось, поэтому ошибка должна быть связана с другими факторами, которые я еще не тестировал полностью, такими как взаимодействие с javascript или что-то, связанное с перезагрузкой страницы, которые не рассматриваются в этом вопросе. Моя форма содержит конфиденциальные данные, поэтому в данный момент я не могу раскрыть полный исходный код, извините. Сказав это, я считаю, что этот вопрос можно пометить как решенный, если только у кого-то нет дополнительных соображений. Всем спасибо!   -  person Marco Luglio    schedule 05.02.2012


Ответы (3)


В разделе стандарта 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/ и проверьте приведенный выше фрагмент самостоятельно, и вы увидите, что поведение такое же, как в современном браузере. Или, поскольку вас, вероятно, это не беспокоит, вы можете проверить этот снимок экрана, на котором я делаю это для вас:

«Скриншот

person Mark Amery    schedule 06.12.2018

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

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

person Scarabeetle    schedule 25.09.2012
comment
-1; Я загрузил Firefox 15 с сайта ftp.mozilla.org/pub/ firefox/releases/15.0/win32/en-GB, и в нем нет описанной здесь ошибки. - person Mark Amery; 07.12.2018

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

e.g.

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

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

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

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

person Eugen Rieck    schedule 04.02.2012
comment
Я немного смущен сейчас. Может быть, я должен был опубликовать пример с моим вопросом. Например, использование ^[\d]{10}$ не соответствует 1234567890 во вводе tel, но должно, не так ли? - person Marco Luglio; 04.02.2012
comment
Откуда взялись эти разговоры о телефонных номерах? Вопрос изменился? - person Borodin; 04.02.2012
comment
Нет, речь конкретно о входе TEL. - person Marco Luglio; 04.02.2012
comment
Это дает некоторую причину для производных реализаций. Может быть, это также где-то указано Mozilla или Opera? - person The Nail; 04.02.2012
comment
Итак, в контексте, если якоря ^ и $ неявны в шаблоне, тогда мне нужно будет добавить *? к 4000, чтобы он соответствовал 4000, 014000 и +4314000. - person Marco Luglio; 05.02.2012
comment
Помещая это в контекст, я бы рекомендовал использовать конечную привязку ($), но не начальную привязку (^) — для меня это золотая середина между надежностью и широтой соответствия. - person Eugen Rieck; 05.02.2012
comment
-1, потому что большая часть этого ответа не касается заданного вопроса, а часть, которая, наконец, делает его, в последних двух абзацах неверна. <input type="tel" pattern="4000"> отклонит ввод 014000, вопреки этому ответу. - person Mark Amery; 07.12.2018