У меня такая проблема:
Например, у меня есть этот тест виртуального URL / {параметр1} / {параметр2} / {параметр3} /
и я хочу извлечь из следующих реальных URL-адресов значения, соответствующие именам параметров из виртуального URL-адреса, и сопоставить их с именами параметров в массиве:
/ тест / abc / def / ghi / Должен вернуть следующий результат:
[
"paramter1" => "abc",
"paramter2" => "def",
"paramter3" => "ghi",
]
/ тест / abc / def / Должен вернуть следующий результат:
[
"paramter1" => "abc",
"paramter2" => "def",
]
Для этого у меня есть следующие 2 функции. Один для извлечения и один для сопоставления.
public static function processUrl($virtualUrl, $realUrl)
{
$realUrlRegex = preg_replace_callback('~\{([^{}]+)\}~',
function ($matches)
{
$repl = '([^)]+)';
self::$tmp[] = $matches[1];
return $repl;
}
, $virtualUrl);
print_r(self::$tmp);
$UrlArray = array();
$matches = array();
$realUrlRegex = str_replace('/', '/', $realUrlRegex);
if (preg_match("/^" . $realUrlRegex . "$/", $realUrl, $matches))
{
print_r($matches);
for ($i = 0; $i < count(self::$tmp); $i++)
{
if (isset($matches[$i + 1])){
$UrlArray[self::$tmp[$i]] = $matches[$i + 1];
}
}
$matches = array();
self::$tmp = array();
return $UrlArray;
}
self::$tmp = array();
return false;
}
public function mapUrl($route, $request)
{
$dynamicParameters = $route->getDynamicParameters() ;
$mappedUrl = preg_replace_callback('/{{([^}]+)}}/', function ($m) use ($dynamicParameters) {
return $dynamicParameters[$m[1]]; }, $request->getUrl());
return $mappedUrl;
}
Для этого у меня есть следующие 2 функции. Один для извлечения и один для сопоставления.
Например, 1 он работает нормально, но если один из виртуальных параметров отсутствует в реальном URL-адресе, совпадение preg не возвращает никаких результатов, и URL-адрес обрабатывается неправильно.






Почему бы не использовать
explode? Если вам нужно регулярное выражение для поиска всех частей между косыми чертами после/test/, вы можете использоватьpreg_match_all('~(?:\G(?!\A)/|^/test/)\K[^/]+~', $request->getUrl(), $matches), см. демонстрация.