Php regexp在URL中查找区域设置

Php regexp在URL中查找区域设置,php,regex,Php,Regex,我正在做正则表达式来解析url,并在我的网站上查找区域设置。我所做的是这个代码: <?php $app_conf = require_once __DIR__ . '/../config/app.php'; function extract_lang($avail) { $uri_lang = []; if (preg_match('/^(\/)+([a-z]{2})(\/+.*)?/', $_SERVER['REQUEST_URI'], $uri_lang)) {

我正在做正则表达式来解析url,并在我的网站上查找区域设置。我所做的是这个代码:

<?php

$app_conf = require_once __DIR__ . '/../config/app.php';

function extract_lang($avail)
{
    $uri_lang = [];
    if (preg_match('/^(\/)+([a-z]{2})(\/+.*)?/', $_SERVER['REQUEST_URI'], $uri_lang)) {
        if (in_array($uri_lang[2], $avail)) {
            $_SERVER['REQUEST_URI'] = isset($uri_lang[3]) ? $uri_lang[3] : "/";
            $_SERVER['HTTP_LANG'] = $uri_lang[2];
        }
    }
}

if ($app_conf['extract_from_uri']) {
    extract_lang($app_conf['locales']);
}
我需要以某种方式更新我的正则表达式,我正在努力解决它,请帮助我。 在locales配置中,我有一个数组

'locales' => ['en', 'ru']
好的,路线应该是这样的

https://m2.test/en/environmental_projects

您可以匹配一个正斜杠,在第一组中捕获2个字符a-z,然后使第2组可选地匹配一个正斜杠和任何字符,除了以锚点结尾的换行符
$

N注意现在有2个捕获组而不是3个,如果您将更改为除
/
以外的字符,例如
~
,则不必转义正斜杠

^/([a-z]{2})(/.*)?$

比如说

if (preg_match('~^/([a-z]{2})(/.*)?$~', $_SERVER['REQUEST_URI'], $uri_lang)) {

带有
en
ru
的url看起来像什么?该模式当前匹配正斜杠的1倍或更多倍,然后是字符a-z的2倍,然后是可选部分,而不是匹配正斜杠的1+倍和任意字符。由于最后一部分是可选的,没有什么可以阻止2个字符的a-z匹配。@第四只鸟更新了我的问题,并举例说明了路由应该是什么样子。比如
^/([a-z]{2})(/.*)?$
如果(preg_match('~^/([a-z]{2})(/.*),$服务器['REQUEST_URI'],$URI lang){
@Thefourthbird好吧,看起来正是我需要的,谢谢!
if (preg_match('~^/([a-z]{2})(/.*)?$~', $_SERVER['REQUEST_URI'], $uri_lang)) {