@ 2018-06-21T13:22:04Z <?php
class UriLanguageResolver
{
private $languages;
private $defaultLanguage;
private $uriBase;
private $regex;
public function __construct(array $languages, string $defaultLanguage, string $uriBase = '')
{
if (!\in_array($defaultLanguage, $languages)) {
throw new \InvalidArgumentException('Default language not present in supported languages');
}
$this->languages = $languages;
$this->defaultLanguage = $defaultLanguage;
$this->uriBase = $uriBase;
$this->regex = '(^(' . \preg_quote($this->uriBase) . ')/(' . \implode('|', $languages) . ')(?=/|$)(.*))';
}
public function resolve(string $uri): UriWithLanguage
{
$language = $this->defaultLanguage;
if (\preg_match($this->regex, $uri, $match)) {
$language = $match[2];
$uri = $match[1] . $match[3];
}
return new UriWithLanguage($language, $uri);
}
}
class UriWithLanguage
{
public $language;
public $uri;
public function __construct($language, $uri)
{
$this->language = $language;
$this->uri = $uri;
}
}
$resolver = new UriLanguageResolver(['en', 'fr', 'de', 'nl'], 'en', '/cms');
$tests = [
'/cms/articles/foo',
'/cms/en/articles/foo',
'/cms/fr/articles/foo',
];
foreach ($tests as $test) {
$parts = $resolver->resolve($test);
echo "
Input URI: {$test}
Language: {$parts->language}
Routed URI: {$parts->uri}
";
}
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Output for 7.1.0 - 7.1.20 , 7.2.0 - 7.2.33 , 7.3.16 - 7.3.33 , 7.4.0 - 7.4.33 , 8.0.0 - 8.0.30 , 8.1.0 - 8.1.28 , 8.2.0 - 8.2.19 , 8.3.0 - 8.3.4 , 8.3.6 - 8.3.7 Input URI: /cms/articles/foo
Language: en
Routed URI: /cms/articles/foo
Input URI: /cms/en/articles/foo
Language: en
Routed URI: /cms/articles/foo
Input URI: /cms/fr/articles/foo
Language: fr
Routed URI: /cms/articles/foo
Output for 8.3.5 Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
Input URI: /cms/articles/foo
Language: en
Routed URI: /cms/articles/foo
Input URI: /cms/en/articles/foo
Language: en
Routed URI: /cms/articles/foo
Input URI: /cms/fr/articles/foo
Language: fr
Routed URI: /cms/articles/foo
preferences:dark mode live preview
100.83 ms | 402 KiB | 164 Q