提问者:小点点

如何在PHP中为重写规则构建正则表达式?


我目前正在尝试为WordPress中的url编写重写规则。 原始URL如下所示:

http://localhost/download/d0RqYU8xek9JOXBsQmJrRGpldWF2QT09/?selected_files%5B0%5D=TURUWEdaWWNtS1ZOd2NSY0MybThCQT09&selected_files%5B1%5D=cWhFVEtlOENNM0VwNmlrUlBmOVF1UT09

/download/后面的第一个值是特定文件存储的唯一标识符。 之后,我添加了一个文件数组。

在WordPress中,我现在想为这个请求写一个重写URL,这样我就可以在我的后端处理它。 为此,我需要一个特定的正则表达式来标识请求并返回用于构建重写URL的匹配项:

public function filter_rewrite_rules_array( $rules ): array {
    $new_rules['download/([0-9][a-z][A-Z]+)/.......'] = admin_url( 'admin-ajax.php' ) . '?download=$matches[1]&selected_files=$matches[2]';
    return array_merge( $rules, $new_rules );
}

关键是我无法完成正则表达式。。。。 谁能帮帮我吗? 即使是第一场比赛也不起作用。

更新:

我希望结果中出现以下URL:

http://localhost/admin-ajax.php?download=d0RqYU8xek9JOXBsQmJrRGpldWF2QT09&selected_files%5B0%5D=TURUWEdaWWNtS1ZOd2NSY0MybThCQT09&selected_files%5B1%5D=cWhFVEtlOENNM0VwNmlrUlBmOVF1UT09

正如我刚才看到的那样--请求可以有多个文件ID。 所以不知道如何用正则表达式来完成这个任务。 这有可能吗?


共1个答案

匿名用户

您可以尝试:

.*?\/download\/(.*?)\/\?(.*)

上述正则表达式的说明:

.*?-懒洋洋地匹配\download之前的所有内容。

\/download\/-字面上与/download/匹配。

(.*?)-表示与您所需的唯一id匹配的捕获组,即懒惰地匹配/?之前的任何内容。

(.*)-表示与URL的其余部分匹配的第二个捕获组。

替换部分:因为http://localhost/admin-ajax.php?download=部分是静态的; 您可以将它与捕获的组一起使用,即http://localhost/admin-ajax.php?download=$1&$2

您可以在这里找到上述正则表达式的演示。