问题
What is the regex for this?
Match if string
- NOT ( ends in .php OR ends in .html OR contains / )
Thank you!
Edit: I need the NOT part because the expression is to be used on an Apache mod rewrite, since I can't change the logic of mod _rewrite to avoid the NOT.
Edit: My initial effort was ([^/]+)(.html)$(^.php)$ -- which is monstrusly wrong
回答1:
Apache mod_rewrite does support negation, according to this document.
In mod_rewrite, the NOT character ('!') is also available as a possible pattern prefix. This enables you to negate a pattern; to say, for instance: ``if the current URL does NOT match this pattern''. This can be used for exceptional cases, where it is easier to match the negative pattern, or as a last default rule.
So you should be able to do something like:
!^(.*?/.*|.*?\.(?:php|html)$)$
And that should match anything which does not contain / and does not end in .php or .html
回答2:
It's a whole lot easier to do positive matches in regex than negative matches. Try searching for ends in .php OR ends in .html OR contains /
and reverse the logic in your program.
With strict regular expressions, there isn't a general way to negate a given expression. With PCRE's you have the advantage of negative look-aheads, which significantly simplify the process of constructing a negated search, at the expense of performance.
^([^/]*\.(?!html$|php$)[^./]*)|[^/.]$
回答3:
Use this regex -
(.*\.php$)|(.*\.html$)|(.*\/.*)
来源:https://stackoverflow.com/questions/3345747/regex-match-this-or-that