Простое отрицание регулярного выражения - PullRequest
1 голос
/ 09 ноября 2010

У меня проблемы с регулярным выражением, поэтому я решил спросить здесь.По сути, мне нужно, чтобы он совпадал с URI для коллекции, за исключением определенной (/new).

, т. Е.

/properties     # match
/properties/25  # match
/properties/new # rejected

.безрезультатно:

/properties(^(/new)).*

Я думаю, что моя проблема с отрицанием, но я не могу понять, что я должен делать .. Объяснение с решением было бы очень полезно!

Ответы [ 3 ]

1 голос
/ 09 ноября 2010

^ отрицается внутри класса символов (группа символов в любом порядке, окруженная [ ]. Вам нужно использовать ?!. Вы также не должны использовать .*. Это ничего не добавляет.Если вы хотите соответствовать чему-либо, просто ничего не ставьте :).Также вам не нужно захватывать матч.В зависимости от того, как вы его настраиваете, вам также может понадобиться экранировать косую черту (/)

Попробуйте:

\/properties(?!\/new)

0 голосов
/ 09 ноября 2010

Как насчет этого:

/properties(?!/new)(?:/.*){0,1}

the: `(?! / New) является отрицательным прямым поиском и по сути говорит: убедитесь, что это не может быть сопоставлено

следующее: (?: /.+) {0,1} допускает сопоставление дополнительных путей (т. Е. / 25) и представляет собой группу без захвата, в которой указано совпадение /, за которым следует ноль или более символов, и сопоставление его от нуля до единицыраз в группе.{0,1} позволяет ему соответствовать, даже если нет /25.

0 голосов
/ 09 ноября 2010

Вы можете просто использовать дополнительные RewriteCond:

RewriteCond $2 !=new
RewriteRule ^/properties(/(.*))?$ …

Это будет соответствовать /properties, /properties/ и /properties/…, за которыми следует что-нибудь еще, но не /properties/new.

...