Альтернативное регулярное выражение для этого \.(asmx(?!/js)|aspx|htm)

Есть ли способ переписать это регулярное выражение таким образом, чтобы оно не включало просмотр вперед для «/js»?

Это даже то, о чем я должен беспокоиться с точки зрения производительности? Он используется для фильтрации HTTP-запросов.

\.(asmx(?!/js)|aspx|htm)

Редактировать: Чтобы было ясно: я хотел бы специально запретить ".asmx/js", но разрешить все остальные запросы .asmx.

BAD: Portal.asmx/js
GOOD: Portal.asmx/UpdateProduct

person Jeff Meatball Yang    schedule 28.09.2009    source источник


Ответы (2)


Если вы хотите заблокировать Portal.asmx/js, но разрешить Portal.asmx/UpdateProduct, есть два способа справиться с этим — шаблон белого списка, в котором перечислены все допустимые значения, или отрицательный поиск нежелательных совпадений.

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

Однако простое использование существующего выражения не будет точно соответствовать тому, что вы хотите. Например, он заблокирует Portal.asmx/json и разрешит Portal.asmx/js.aspx, которые могут быть не вероятными URL-адресами, а просто выделить то, что нужно исправить.

Это выражение (скопированное из ответа без век) будет правильно обрабатывать вещи:

\.(asmx(?!/js[/\z])|aspx$|html?$)


Стоит пояснить, что класс символов [/\z] будет соответствовать либо /, либо <end of string>\z совпадает с $, но работает в классах символов (где $ соответствует буквальному символу $).
(Есть различия между $ и \z, но только в многострочном режиме, что не имеет отношения к фильтрации URL-адресов).


Как правило, не беспокойтесь о производительности, если только у вас нет измеримых проблем с производительностью (иначе как вы узнаете, повлияло ли то, что вы изменили, на какую-либо разница).

person Peter Boughton    schedule 28.09.2009
comment
-1: вопрос требует регулярного выражения, которое может обрабатывать путь после asmx/, но не asmx/js - person eyelidlessness; 28.09.2009
comment
Первоначальный вопрос не спрашивал об этом, это новое дополнение, добавленное через час после того, как я ответил. - person Peter Boughton; 28.09.2009
comment
Я просто объяснил, почему поставил -1, потому что ответ был неверным. Я думаю, что важно объяснить отрицательные голоса. Я удалил -1 теперь, когда вы отредактировали. - person eyelidlessness; 29.09.2009
comment
Справедливо. :) Предпочел бы уведомление об изменении исходного вопроса, но это ТАКАЯ проблема, а не вы. - person Peter Boughton; 29.09.2009

Не беспокойтесь о производительности такого простого просмотра вперед. Ваше регулярное выражение в порядке.

Изменить: но он может обнаруживать ложные срабатывания (например, Portal.asmx/jssomething), вы можете попробовать что-то вроде:

\.(asmx(?!/js[/\z])|aspx$|html?$)
person eyelidlessness    schedule 28.09.2009