开发者

Regex pattern help (I almost have it, just need a bit of expertise to finish it)

I need to match two cases

js/example_directory/example_name.js 

an开发者_如何学Pythond

js/example_directory/example_name.js?12345  

(where 12345 is a digit string of unknown length and the directory can be limitless in depth or not exist at all)

I need to capture in both cases everything between js/ and .js

and if ? exists capture the digit string after ?

This is what I have so far

^js/(.*).js\??(\d+)?

This works except it also captures

js/example_directory/example_name.js12345 

I want the regex to ignore that. Any suggestions?

Thank you all!

Test your patterns here

Answer:

Using Gumbo's information my final rewrite rule is as follows.

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteBase /
 RewriteCond %{SCRIPT_FILENAME} !-d
 RewriteCond %{SCRIPT_FILENAME} !-f
 RewriteCond %{QUERY_STRING} ^\d*$
 RewriteRule ^js/(.*)\.js$ js.php?f=$1.js&v=%0 [L]
</IfModule>


Include the whole querystring pattern, including the ? in one conditional match.

^js/(.*).js(\?\d+)?


mod_rewrite’s RewriteRule directive does only test the URI path and not the query. So using a rule like the following does already match both URIs:

RewriteRule ^js/(.*)\.js$ …

If you now want to test the query too, you need to use an additional RewriteCond:

RewriteCond %{QUERY_STRING} ^\d*$
RewriteRule ^js/(.*)\.js$ …

The match of the last successful RewriteCond can be referred to with %n, so in case of the whole match %0 or in this case even just %{QUERY_STRING} directly.


As far as regular expressions go - you can use the (?:) (non capture grouping) to make the \?(\d+) as a chunck, optional like so:

^js/(.*).js(?:\?(\d+))?

You really don't >need< to use the ?: (non capture) portion, but if you don't, back references will be changed - 1 will point at the filename, 2 will point at ?1234 and 3 will be 1234

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜