Трябва ли да използвам ^ и $ при валидиране на модел на регулярен израз за въвеждане на html5?

Виждал съм предимно примери без знаците ^ (циркумфлекс) и $ (валута или долар), за да маркирате началото и края на съвпадащия низ. Въпреки това не намерих нищо относно това в спецификацията на 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).

Във входове тип="текст" моделът работи добре, като използва двата формата, но при входове тип="тел" трябваше да премахна знаците, за да може регулярният израз да работи според очакванията. Тествах и в Opera, и в Firefox.

Това грешка в браузъра ли е? Трябва ли да подам бъг в bugzilla и т.н.?


Редактиране: Изглежда, че попаднах на странен бъг, защото не мога да създам намален тестов случай. Едно просто въвеждане в страница не показва поведението, посочено по-горе. Въпросът обаче остава. Трябва ли или не трябва да използвам проклетите ^ и $ котви?


person Marco Luglio    schedule 04.02.2012    source източник
comment
developer.mozilla.org/en/HTML/Forms_in_HTML споменава това във входа tel: Новите редове се премахват автоматично от въведената стойност, но не се прилага друг синтаксис, тъй като телефонните номера варират значително в международен план. Можете да използвате атрибути като pattern и maxlength, за да ограничите стойностите, въведени в контролата.. Не споменава нищо конкретно за типа 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
Изолиран input=tel се държи според очакванията, така че грешката трябва да е свързана с други фактори, които все още не съм тествал обстойно, като взаимодействие с javascript или нещо общо с презареждането на страници, които не са обхванати в този въпрос. Моят формуляр съдържа чувствителни данни, така че в момента не мога да разкрия пълния изходен код, за съжаление. Като казах това, считам, че този въпрос може да бъде маркиран като разрешен, освен ако някой няма допълнителни съображения. Благодаря на всички!   -  person Marco Luglio    schedule 05.02.2012


Отговори (3)


Разделът на HTML Standard за атрибута 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 във входен телефон, но трябва, нали? - 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