2010-07-27 4 views
4

Quelle est la regex pour cela?Regex correspond à cela OU cela?

match si la chaîne

  • NOT (se termine en .php OU se termine par .html OU contient /)

Merci!

Editer: J'ai besoin de la partie NON parce que l'expression doit être utilisée sur un réécriture de mod Apache, puisque je ne peux pas changer la logique du mod _rewrite pour éviter le NOT.

Edit: Mon premier effort était ([^ /] +) (html.) $ (^ Php.) $ - ce qui est monstrusly mal

+6

Quels efforts avez-vous mettre jusqu'à présent? –

+0

([^ /] +) (\. Html) $ (^ \. Php) $ - ce qui est monstrueusement erroné – johnjohn

+2

Il est toujours bon de le mettre dans la question, pour montrer que vous avez fait un effort. –

Répondre

6

Apache mod_rewrite ne négation de soutien, selon this document.

Dans mod_rewrite, le personnage ne ('!) Est également disponible en tant que possible préfixe de modèle. Cela vous permet de annuler un motif; dire, pour par exemple: `` si l'URL actuelle ne correspond pas à ce modèle ''. Cela peut être utilisé pour des cas exceptionnels, où est plus facile de faire correspondre le modèle négatif , ou comme dernière règle par défaut.

Donc, vous devriez être en mesure de faire quelque chose comme:

!^(.*?/.*|.*?\.(?:php|html)$)$ 

et qui devrait correspondre à quelque chose qui ne contient pas/et ne se termine pas en .php ou .html

+0

Fantastique!Merci beaucoup. Je n'étais pas au courant de! fonctionnalité. J'espère que je demanderai mieux la prochaine fois. – johnjohn

+0

Pas de problème, nous apprenons toujours. :) –

+0

Est-il possible d'ajouter ceci comme variable maintenant? J'ai essayé RewriteRule!^(. *? /.* |. *? \. (?: php | html) $) $ headers.php? A = $ 1 [NC, L] mais il ne passera pas la variable – johnjohn

3

Il est beaucoup plus facile de faire des rencontres positives regex que correspondances négatives. Essayez de rechercher ends in .php OR ends in .html OR contains / et inversez la logique dans votre programme.

Avec des expressions régulières strictes, il n'existe pas de moyen général d'annuler une expression donnée. Avec les PCRE, vous avez l'avantage des anticipations négatives, ce qui simplifie considérablement le processus de construction d'une recherche annulée, au détriment de la performance.

^([^/]*\.(?!html$|php$)[^./]*)|[^/.]$ 
+0

Je ne peux pas parce que j'en ai besoin pour une règle de réécriture Apache. :( – johnjohn

+2

John, cette information devrait être dans la question! –

+0

@Peter Boughton: ajouté, merci – johnjohn

0

Utilisez cette regex -

(.*\.php$)|(.*\.html$)|(.*\/.*) 
+0

Merci d'avoir répondu, mais il manque la partie NOT. Il correspond à "foo.php" "fo/o" et "foo.html" .Il devrait correspondre à tout sauf à – johnjohn

+0

oups! permettez-moi de mettre à jour mon regex – Gopi