Я хочу сопоставить URL-адрес на моей странице 404 и на основании этого хочу перенаправить пользователя в конкретное место.
URL-адрес: http://domain.com/there/12345
// example: /there/12345 $request = $_SERVER['REQUEST_URI']; if (preg_match('', $request)) { }
Что REGEX я должен поставить, чтобы получить это? И как только тест будет успешным, как я могу получить этот идентификатор ( 12345 ) сразу после его постоянной?
Регулярное выражение, которое вы хотите использовать:
$str=$_SERVER['REQUEST_URI']; $regex = '/\/there\/(\d+)/'; $matches=array(); preg_match($regex, $str, $matches); var_dump($matches)
Это дает
array 0 => string '/there/12345' (length=12) 1 => string '12345' (length=5)
Обратите внимание на скобки вокруг \d+
захватить все, что соответствует \d+
(т.е. непрерывная строка цифр 0-9)
Если вы хотите иметь шестнадцатеричный идентификатор (например, 12ABF), вы должны изменить \d+
на [a-zA-Z\d]+
Вы также можете использовать функцию basename .
$path = "http://domain.com/there/12345"; $filename = basename($path); echo $filename; // Sholud be 12345
Это должно делать то, что вам нужно:
$request = $_SERVER['REQUEST_URI']; $match = array(); if (preg_match('@^/there/(\d+)$@', $request, $match)) { $id = $match[1]; // Do your processing here. }
Или если вы склонны забывать синтаксис \ d и хотите избежать символа @ или / в качестве разделителя:
$request = '/there/12345'; if (preg_match('#/there/([0-9]+)#', $request, $match)) { $id = $match[1]; echo "ID: $id"; }
Это будет работать 🙂
if(preg_match('#^/there/(\d+)$#', $request, $matches)){ echo "the id is {$matches[1]}"; } else { echo "no match!"; }
См. Здесь работу
объяснение
# delimiter ^ beginning of string /there/ string literal '/there/' ( begin capture group 1 \d+ one or more [0-9] ) end capture group 1 $ end of string # delimiter