У меня есть следующий шаблон URL-пути
/posts(/:id:)?
Что было бы лучшим способом заполнить его аргументами и сопоставить их с шаблоном?
Во-первых, я заменяю соответствующий шаблон аргумента (:id:
) с реальным предоставленным и построить перспективы выходной URL
preg_replace_callback('~:([^:]+):~', function($match) {
//aggregate the match &&
//1) return the output url ||
//2) return the output pattern
}, $pattern);
В зависимости от аргумента, это может выглядеть примерно так: /posts/3
, Во-вторых, я называю preg_replace_callback
снова, чтобы построить шаблон вывода. Наконец, я сравниваю два результата preg_match
обеспечить достоверность сегмента. Псевдокод
argument => 3, outputUrl => /posts/3
pattern => [\d]+, outputPatterm => /posts(/[\d]+)?
preg_match(outputPattern, outputUrl) => matches...
пример
$this->patterns = [
'id' => '[\d]+'
];
$this->arguments = [
'id' => 3
];
$pattern = '/posts(/:id:)?';
$outputPattern = preg_replace_callback('~:([^:]+):~', function($match){
return $this->patterns[$match[1]];
}, $pattern);
$outputUrl = preg_replace_callback('~:([^:]+):~', function($match){
return $this->arguments[$match[1]];
}, $pattern);
if (preg_match('~^'.$outputPattern.'$~', $outputUrl)) {
//nice, they match. Still two preg_* methods used
}
Задача ещё не решена.
Других решений пока нет …