Используйте RegularExpressionValidator, чтобы разрешить один из двух шаблонов в начале ввода - PullRequest
0 голосов
/ 26 января 2012

У меня есть RegularExpressionValidator (ASP.NET 2.0), который я использую, чтобы убедиться, что URL, введенный в текстовое поле, начинается правильно с http://. Я использовал выражение ValidationExpression ^http://. Теперь я также разрешаю mailto ссылки, поэтому мое выражение ^http://|^mailto:.

Он работает в тестере регулярных выражений (установлен на клиентском движке Javascript) для таких входных данных, как "http://www.google.com" и" mailto: somebody@anymail.net ". Но RegularExpressionValidator на моей странице не делает" Пропустить любые действительные входные данные.

Я пробовал следующие варианты, все из которых работают в тестере, но ни одна из которых не работает в валидаторе:

  • (^http://)|(^mailto:)
  • ^(http://)|(mailto:)
  • ^http://|^mailto:
  • ^(http://|mailto:)
  • http://|mailto:
  • ^((http://)|(mailto:))

Объявление валидатора таково:

<asp:RegularExpressionValidator ID="revEditUrl" runat="server"
   ControlToValidate="txtEditUrl" ErrorMessage="Url must begin with 'http://' or 'mailto:'"
   ValidationExpression="^((http://)|(mailto:))" Display="Dynamic"
   ValidationGroup="myGroup" />

Мое намерение - разрешить любой ввод, начинающийся либо с http: //, либо с mailto :. Что я тут не так делаю?

ОБНОВЛЕНИЕ: Страница MSDN по регулярным выражениям в ASP.NET говорит:

Вам не нужно указывать начало и конец строки, соответствующие символам (^ и $) - они предполагаются. Если вы добавите их, это не повредит (или не изменит) ничего - это просто не нужно.

Означает ли это, что предполагается, что в моем входе нет ничего, что не соответствовало бы моему регулярному выражению (т.е. это должно быть либо http://, либо mailto:)? Если так, то почему мой оригинальный шаблон ^http:// сработал?

Ответы [ 2 ]

1 голос
/ 26 января 2012

Вам нужно сбежать :: и /.

Кроме того, мне интересно, если RegularExpressionValidator автоматически не предполагает, что вся строка соответствует и подразумевает $ в конце. Попробуйте:

^((http\:\/\/)|(mailto\:))(.+)$
0 голосов
/ 26 января 2012

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

...