理解一个简单的正则表达式

时间:2013-10-14 17:30:33

标签: php regex .htaccess symfony

我正在开发一个Symfony2 PHP应用程序。在我的Wamp服务器中,应用程序存储在www/mySite/中,而我的index.php是www/mySite/web/app_dev.php。因为/我有像127.0.0.1/mySite/web/app_dev.php

这样的网址

我想更改路径,因此只需输入127.0.0.1即可访问我的索引文件。经过一些研究,我发现在www文件夹中写这个.htacces有效:

RewriteEngine on
Rewritecond %{REQUEST_URI} !^/mySite
Rewriterule ^(.*)$ /mySite/web/app_dev.php

唯一的问题是我不明白为什么。有人向我解释一下吗? 我真的不明白最后两行,正如^(.*)$

这样的正则表达式

由于

4 个答案:

答案 0 :(得分:6)

这确实是一个简单的正则表达式:

^(.*)$

让我们分手吧:

  • ^ - 请求字符串
  • () - 捕获组,用于匹配字符串的一部分
  • . - 任何角色
  • .* - 任何次数的任何特征
  • $ - 字符串结尾

所以,把它们放在一起,就意味着:“匹配任意数量的任何字符”。之后,这个匹配的部分(括号中的部分)被/mySite/web/app_dev.php替换。

为了更多地解释正则表达式,我们可以设想不同的正则表达式:

  • ^lorem.*$ - 字符串以“lorem”开头,后跟任意数量的任何字符
  • ^$ - 一个空字符串
  • ^...$ - 包含三个字符的字符串。

现在,把它们放在一起--Apache的重写规则通常由两个指令构成:RewriteCondRewriteRule。后一个指令只会影响符合RewriteCond中给出的条件的请求。您可以将它们视为“if-then”对:

# the "if" part - if request URI does not match ^/mySite
Rewritecond %{REQUEST_URI} !^/mySite

# the "then" part - then rewrite it to "/mySite/web/app_dev.php"
Rewriterule ^(.*)$ /mySite/web/app_dev.php

答案 1 :(得分:3)

Rewritecond %{REQUEST_URI} !^/mySite

检查并确保所请求的uri不以(“!”)开头(“^”)“/ mySite”

Rewriterule ^(.*)$ /mySite/web/app_dev.php

如果确实如此,请以(“^”)任意字符(“。”)开头任意次数(“*”)并将其发送至“/mySite/web/app_dev.php"

所以/ controller / site-action的URI将发送到该文件,而/mySite/css/style.css则不会。

答案 2 :(得分:0)

许多要检查的地方会给出细分和解释:http://regex101.com/

答案 3 :(得分:0)

正则表达式在字符后起作用。在`.htaccess中,它检查当前URI是否与正则表达式匹配。在此图像中,按照字符后面的行字符返回true:

Regular expression visualization

^$代表字符串的开头和结尾。 .允许任何字符和*告诉“尽可能多地重复最后一条规则”。