То, о чем вы говорите, называется отрицательный взгляд , и вы просто заключаете его в регулярное выражение для того, что вы не хотите сопоставлять, например: (?!foo)
. Объединить регулярные выражения можно так же просто, как связать их вместе с помощью канала между ними, но в этом случае вы можете сделать это немного лучше. Это регулярное выражение повторно использует первую часть двух регулярных выражений, которая идентична:
[a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+)
Поскольку канал (или '|'
, оператор чередования) имеет более низкий приоритет, чем что-либо еще, чередование должно содержаться в группе. Обратите внимание, что я использовал группу без захвата - то есть (?:...)
- и избавился от скобок в ваших регулярных выражениях. В противном случае они скинули бы нумерацию той группы, которую вы делайте , которую хотите захватить, и вам пришлось бы использовать что-то отличное от $1
во второй части правила. Вот все регулярное выражение:
^/content(?![a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+))(.*)
РЕДАКТИРОВАТЬ: Очевидно, что регулярное выражение, используемое AliasMatch, не поддерживает прогнозирование, но имеет собственный синтаксис отрицания: !(^/foo)
. Похоже, что его целью является отрицание всего регулярного выражения, что означает, что это не поможет вам, но, возможно, вам это не нужно. Может быть, вы можете просто псевдоним этих каталогов для себя. Тогда вам не придется ничего отрицать.
AliasMatch ^(/content/[a-zA-Z0-9_-]+/id-[a-zA-Z0-9_-]+/[0-9]+.*) $1
AliasMatch ^(/content/[a-zA-Z0-9_-]+/nn-[a-zA-Z0-9_-]+.*) $1
AliasMatch ^/content/(.*) /home/username/public_html/$1
Или, может быть, вы можете что-то сделать с помощью директивы <DirectoryMatch>
, или переключившись на mod_rewrite. Но я (очевидно) не эксперт по Apache - моя специальность - регулярные выражения, и я не думаю, что регулярное выражение решит вашу проблему.