【问题标题】:.htaccess regular expression difference/pros/cons.htaccess 正则表达式差异/优点/缺点
【发布时间】:2012-03-13 04:35:54
【问题描述】:

我的 .htaccess 中有一堆规则(子域、文件夹、用户特定文件夹等...)

我现在正在使用这个正则表达式:

([a-z0-9A-Z])

我正在寻找一个特定的规则,我找到了多种构建它的方法,我想知道 如果有这些的标准做法?使用类似的东西有什么区别/优点/缺点:

  • ([^.]+)
  • ([^/]+)
  • (.*)
  • ([a-z0-9]+)

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/8145128/…
  • Apache regexp 引擎与 PHP 和 Perl 中的 PCRE 引擎相同。我的建议是保持简单愚蠢。当然一个人很简单,...例如恕我直言,\w[a-z0-9A-Z] 更容易阅读。这是一个“生命的意义”问。SO 与哲学无关。
  • 我认为 Perl 实际上并没有使用 PCRE。

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

假设我们有这个 .htaccess:

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L]

您的问题中提到的表达式将具有以下逻辑:

^(.*)$

  • . : 匹配任意字符和任意单个字符
  • * : 匹配前一个符号的零个或多个

基本上它会匹配任何东西:

  • folder1/file1.html: $1 将folder1/file1.html
  • file1.html:$1 将是 file1.html

这样很容易用 PHP 或 Python 解析整个请求。另一方面,您不会过滤 URL 中任何您必须在脚本中验证的不需要的字符。

例子: =@*-+

([^.]+)

  • [] :匹配方括号内的任何符号
  • [^] :匹配大括号内列出的字符以外的任何字符 (ref)。
  • + : 匹配上一个符号中的一个或多个
  • [^.] :匹配除. 之外的任何字符。找到. 字符时将停止匹配

来自ref

字符类中唯一的特殊字符或元字符是右括号 (])、反斜杠 ()、插入符号 (^) 和连字符 (-)。通常的元字符是字符类中的普通字符,不需要用反斜杠转义。要搜索星号或加号,请使用 [+*]。如果您在字符类中转义常规元字符,您的正则表达式将正常工作,但这样做会显着降低可读性。

基本上它会匹配任何东西:

  • folder1/file1.html: $1 将folder1/file1
  • file1.html:$1 将是 file1

这和第一个效果一样,除了这个去掉点.之后的所有内容

^([^/]+)$

  • []:匹配方括号内的任何符号
  • +:匹配上一个符号中的一个或多个
  • ^:匹配字符串的开头
  • [^/] :匹配除/ 以外的任何字符。找到/ 字符时将停止匹配

这与第一个效果相同,除了它将检查直到/ 的任何请求。因此,如果您有多个文件夹,则必须多次包含此正则表达式。

基本上它会匹配任何东西(如果你只有一组):

  • folder1/file1.html: $1 将folder1
  • file1.html:$1 将是 file1.html

如果你有 2 个:

  • folder1/file1.html:$1 将匹配 folder1,$2 将匹配 file1.html
  • file1.html:$1 将是 file1.html

您拥有的文件夹越多,您可能需要添加的规则就越多。

^([a-z0-9]+)$ [ ^([a-z0-9.]+)$ 示例]

  • [] :匹配方括号内的任何符号
  • + : 匹配上一个符号中的一个或多个
  • a-z :匹配从 a 到 z 的字母
  • 0-9 : 匹配 0-9 的数字

(您也可以使用 \d 或 \w)

基本上它会匹配任何东西(如果你只有一组 - 添加点):

  • folder1/file1.html: $1 将folder1
  • file1.html:$1 将是 file1.html

如果你有 2 个:

  • folder1/file1.html:$1 将匹配 folder1,$2 将匹配 file1.html
  • file1.html:$1 将是 file1.html

除了你必须指定你想要的字符之外,这一个和上一个一样工作。因此,当你在 PHP 中检查你的字符串时,你就知道你得到了哪些字符。 就像在我的文件名示例中一样,我必须添加 \. 以便它识别点。这个执行起来也更快。

查看基准:.htaccess mod_rewrite performance

因此,如果您知道您将收到哪种类型的请求,您可以始终使用最后一个请求,但如果您不确定,则必须选择更适合您需要的请求。它们之间可能存在更多差异,但了解这些正则表达式的主要目标是了解它们的作用或捕获的内容。此外,性能是您需要考虑的因素。匹配所有内容然后在 PHP 或 Python 中解析请求可能比一开始简单地匹配它们并简单地在脚本中使用它们需要更长的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多