негативный взгляд вперед, чтобы исключить HTML-теги - PullRequest
0 голосов
/ 28 апреля 2010

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

Для одной строки текста отлично работает следующее:

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

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

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

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

Это отлично работает:

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

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

Есть идеи? Спасибо!

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

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

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

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

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

0 голосов
/ 29 апреля 2010

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

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

...