首页 > 解决方案 > 正则表达式在 URL 中查找语言环境

问题描述

我正在做正则表达式来解析 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']);
}

它大部分时间都在工作,但它有错误。如果我给定的 url 以 'en' 开头 - 它认为它是一个语言环境并崩溃我的应用程序的逻辑。导致错误的示例路线:

https://m2.test/environmental_projects

我需要以某种方式更新我的正则表达式,我正在努力解决它,请帮助我。在语言环境配置中,我有数组

'locales' => ['en', 'ru']

好的路线应该看起来像

https://m2.test/en/environmental_projects

标签: phpregex

解决方案


您可以匹配单个正斜杠,在第一组中捕获 2 个字符 az,然后使第 2 组可选匹配正斜杠和除以锚结尾的换行符之外的任何字符$

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

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

查看正则表达式演示

例如

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

推荐阅读