2010-04-27 3 views
0

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

Следующие штраф для одной строки текста произведения:

^(?!.*(<|>)).*$ 

..но не допустит каких-либо символов новой строки из-за точкой (.). Если я с чем-то вроде этого:

^(?!.*(<|>))(.|\s)*$ 

это позволит несколько строк, но выражение соответствует только «<» и «>» на первой линии. Мне нужно, чтобы она соответствовала любой строке.

Это прекрасно работает:

^[-_\s\d\w&quot;'\.,:;#/&\$\%\[email protected]\+\*\\(\)]{0,4000}$ 

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

Любые идеи? Благодаря!

+0

Люди всегда делают это со мной, когда задаю вопросы с регулярным выражением для html - 'use parser' :) Хорошо, серьезно сейчас: вам нужно сказать что-то о технологии, которую вы используете. Вы уверены, что \ w получит нелатинские или странные буквы? Вы можете прокормить его с помощью 'ąćęłóńśżź' для начала – naugtur

+0

Вызов bobince .... –

+0

Хорошо, я не включал никакой информации о технологии, потому что я не думал, что это было актуально в то время. Наверное, это так. Регулярное выражение будет использоваться в теге RegularExpressionValidator на странице ASP.Net.Поэтому целью является проверка того, что теги не существуют на стороне клиента, прежде чем форма будет отправлена ​​на сервер. – Remoh

ответ

1

Обратите внимание, что ваш RE запрещает пользователям вводить < и > в любом контексте. «2 > 1», например. Это очень нежелательно.

Вместо того, чтобы использовать regular expressions to match HTML (что они не очень хорошо подходят, чтобы сделать), просто избежать < и >, превращая их в &lt; и &gt;. Кроме того, найдите пакет для вашего языка выбора, который реализует белый список, чтобы разрешить ограниченное подмножество HTML или поддерживает собственный язык разметки (я слышу, что markdown хорош).

Что касается "." не соответствующие символам новой строки, некоторые реализации регулярных выражений поддерживают флаг (обычно «m» для «multi-line» и «s» для «single line», последний приводит к тому, что «.» соответствует символам новой строки) для управления этим поведением.

Первые два в основном эквивалентны /^[^<>]*$/, за исключением того, что это работает на многострочных строках. Любая причина, почему вы так не писали RE?

+0

DAL приложения уже обрабатывает экранирование любых «опасных» символов, но я предпочел бы сделать это в обоих местах. В прошлом я также заметил, что валидаторы ASP.Net на стороне клиента, как правило, задыхаются от всего, что похоже на тег, поэтому я тоже стараюсь избегать этого. – Remoh

+0

Я знаю, что то, что я показал до сих пор, не позволит использовать «<' and '>», и я планировал заняться этим после того, как я получу отрицание. Я проверю, есть ли многострочный флаг. – Remoh

0

Итак, я просмотрел его и есть опция .Net 'SingleLine' для регулярных выражений, которая вызывает «.». чтобы также совпадать с новым символом линии. К сожалению, это невозможно в ASP.Net RegularExpressionValidator. Насколько я вижу, нет никакого способа сделать что-то вроде^(?!. (< \ w +>)). $ работают над многострочным текстовым полем без проверки на стороне сервера.

Я принял ваш совет и пошел по пути преодоления тегов на стороне сервера. Для этого нужно настроить директиву страницы проверки на «ложь», но в этом конкретном случае это не очень важно, потому что поле комментариев - это единственное, о чем нужно беспокоиться.

Смежные вопросы