PHP正则表达式从$#u服务器[';请求&#URI';]获取WordPress类别slug

PHP正则表达式从$#u服务器[';请求&#URI';]获取WordPress类别slug,php,regex,wordpress,Php,Regex,Wordpress,我试图使用pre_match模式从$\u服务器['REQUEST\u URI']获取类别slug,但它不起作用 例如,$\u服务器['REQUEST\u URI']返回/category/current affairs/,我想将current affairs设置为我想要使用的变量 到目前为止,我想出了这个,但它不起作用 ^\/category\/(?:\/(\w+)))$/g 非常感谢您的帮助。您的正则表达式匹配: 从字符串的开头开始^ 匹配正斜杠\/ 匹配类别 匹配正斜杠\/ 非捕获组(?:

我试图使用pre_match模式从
$\u服务器['REQUEST\u URI']
获取类别slug,但它不起作用

例如,
$\u服务器['REQUEST\u URI']
返回
/category/current affairs/
,我想将
current affairs
设置为我想要使用的变量

到目前为止,我想出了这个,但它不起作用
^\/category\/(?:\/(\w+)))$/g

非常感谢您的帮助。

您的正则表达式匹配:

  • 从字符串的开头开始
    ^
  • 匹配正斜杠
    \/
  • 匹配
    类别
  • 匹配正斜杠
    \/
  • 非捕获组
    (?:
    重复零次或多次
    *
  • 在此非捕获组中,将正斜杠与捕获组中的
    \w
    匹配一次或多次
    \/(\w+)
  • 字符串的结尾
    $
使用此部分
\/(\w+)
您正在尝试匹配
时事

但这部分是匹配的

  • 正斜杠
    \/
  • 在组中捕获一次或多次 但是您的文本中有一个连字符
    -
完整模式预期匹配,例如
/category
、2个前斜杠
/
[A-Za-z0-9!]+

它将匹配:

/category//时事

但不是

/category//时事/
/category/currentfairs/
/category//时事/
/category//时事

我想你可以这样得到你的对手:


由于以下几个原因,您的模式不起作用:

  • 您正在尝试匹配
    /
    (在本节
    \/(?:\/
  • \w
    -
    不匹配。它与
    a-zA-Z0-9
  • 您总是确保最后一个
    /
    (?:\/(\w+)))*$
  • 密码 注意:下面的正则表达式使用不同的正则表达式分隔符(例如,在链接中,我使用
    @
    而不是
    /
    来分隔模式)。这允许我们在模式内使用
    /
    ,而不必首先转义它

    • /category/
      逐字匹配
    • \K
      重置报告匹配的起始点。任何以前使用的字符不再包括在最终匹配中
    • [^/]*
      匹配除
      /
      以外的任何字符任意次数
    用法
    您不需要正则表达式。wp有一个为您执行的函数:

    if(is_category()) {
        $category = get_query_var('cat');
        $current_cat = get_category($cat);
        echo 'The slug is ' . $current_cat->slug;
    }
    
    这应该起作用:

    \/category(.*)
    

    一种非常简单的方法是将uri分解为数组并读取第三个值:

    $request_uri = explode('/', $_SERVER['REQUEST_URI']);
    $category = $request_uri[2];
    

    regex101.com是开发和分析regex的最佳工具。
    \/category(.*)
    
    $request_uri = explode('/', $_SERVER['REQUEST_URI']);
    $category = $request_uri[2];