Ошибка сценария на стороне клиента валидатора регулярного выражения asp.net - PullRequest
5 голосов
/ 01 декабря 2009

У меня есть следующий валидатор регулярных выражений, чтобы определить, содержит ли входная строка теги HTML / script и, если это так, вызвать ошибку проверки:

<asp:TextBox ID="txt" runat="server" />
    <asp:RegularExpressionValidator 
        ControlToValidate="txt" 
        runat="server"
        ID="regexVal"
        EnableClientScript="true"  Display="Dynamic"
        ErrorMessage="Invalid Content" 
        Text="!" 
        ValidationExpression=">(?:(?<t>[^<]*))" />

Когда я запускаю страницу с этой разметкой, я получаю сообщение об ошибке с сообщением «Ошибка синтаксиса в регулярном выражении». Однако, когда я беру тот же regex и запускаю его, используя класс Regex из System.Text.RegularExpressions, все работает нормально: Вот так:

Regex r = new Regex(">(?:(?<t>[^<]*))");
r.IsMatch(@"<b>This should cause a validation error</b>");
r.IsMatch("this is fine");

Чего мне не хватает

UPDATE: Кажется, ошибка происходит в следующей функции js в WebResource.axd:

function RegularExpressionValidatorEvaluateIsValid(val) {
    var value = ValidatorGetValue(val.controltovalidate);
    if (ValidatorTrim(value).length == 0)
        return true;
    var rx = new RegExp(val.validationexpression); //this is the line causing the error
    var matches = rx.exec(value);
    return (matches != null && value == matches[0]);
}

Ответы [ 5 ]

11 голосов
/ 01 декабря 2009

Мне кажется, проблема в том, что JavaScript не понимает синтаксис регулярных выражений .NET для группировки.

Когда вы устанавливаете EnableClientScript в true на RegularExpressionValidator, ASP.NET повторно создает ваше регулярное выражение в JavaScript, чтобы включить проверку на стороне клиента для ваших элементов управления. В этом случае JavaScript не поддерживает синтаксис для именованных групп (?<t>...) и групп без захвата (?:...). Пока эти функции работают в .NET, JavaScript борется с ними.

С Управление RegularExpressionValidator (общий справочник) на MSDN :

На клиенте JScript обычный Синтаксис выражения используется. На сервер, используется синтаксис Regex. Так как Синтаксис регулярного выражения JScript является Подмножество синтаксиса Regex, это Рекомендуется использовать JScript синтаксис регулярного выражения для того, чтобы дают одинаковые результаты как на клиент и сервер.

Есть два способа исправить это:

  1. Отключите генерацию сценариев на стороне клиента и используйте функцию регулярного выражения на стороне сервера. Вы можете сделать это, установив EnableClientScript в false.
  2. Изменить регулярное выражение и удалить незаписываемые группы и именованные группы. Если вам нужно захватить регулярное выражение, синтаксис (...) должен работать правильно как в JavaScript, так и в .NET. Затем вы будете использовать ссылки на порядковые номера для доступа к захваченным значениям ($1, $2 и т. Д.). Что-то вроде >[^<]* должно работать как задумано. См. Группирование конструкций на MSDN .

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

  • Ваше оригинальное регулярное выражение, кажется, вообще не нуждается в захвате, если все, что вы хотите сделать, это проверить наличие открывающей угловой скобки. Его можно переписать как >[^<]*, что будет проще и будет работать точно так же. Он не будет захватывать какие-либо значения в исходной строке, но, поскольку вы используете его в элементе проверки ASP.NET, это не должно иметь значения.
  • Способ реализации RegularExpressionValidator будет работать только в случае успешного совпадения. В вашем случае ваша проверка пройдёт, если в вашем текстовом поле будет что-то вроде >blah. Я думаю, вы хотите, чтобы это работало наоборот.
  • Если вы измените регулярное выражение на >[^<]*, регулярное выражение все равно не будет работать так, как, я думаю, вы собираетесь. Контроль проверки пытается сопоставить весь текст в текстовом поле. Поэтому, если я введу >blah в текстовое поле, оно будет соответствовать, но <b>blah</b> не будет, потому что регулярное выражение говорит, что строка должна начинаться с >. Я бы предложил попробовать что-то вроде .*>.*[^<]*, чтобы разрешить текст до >.
1 голос
/ 02 ноября 2010

Это помогло мне:

(^[^<>]*$)|(^[^>]*$)|(^[^<]*$)

Я хотел, чтобы пользователь мог использовать один <или>, но нет. (Это не сработает на> все <, но я могу жить с этим) </p>

1 голос
/ 01 декабря 2009

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

Используя Firebug Console в FF3.5, запустите это, чтобы запустить все средства проверки на стороне клиента:

for(var _v=0; _v<Page_Validators.length; _v++){
    ValidatorValidate(Page_Validators[_v]);
}

, затем введите текст в текстовое поле txt и снова запустите скрипт, выдается исключение:
"неверный квантификатор? [^ <] *))" </strong>

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

0 голосов
/ 20 октября 2013

ты должен попробовать это Regex r = new Regex (@ "> (?: (? [^ <] *))"); </p>

0 голосов
/ 02 августа 2012

Благодаря dariom ... это кажется кратким и работает ... [RegularExpression (@ "[^ <>] *", ErrorMessage = "Пожалуйста, без тегов SCRIPT.")]

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