PHP регулярное выражение для определения URL URI - PullRequest
2 голосов
/ 05 июля 2019

Я пытаюсь определить URI с возможностью получения параметров и т. Д. Мне просто нужно получить / val1 / val2 независимо от того, есть ли URL-адрес и получить параметры и т. Д. Как я могу сделать это в php?

Спасибо

$regex = '/^\/index.php?(.*)?\?+$/';

// Here are some example URLS
site.com/val1/val2
site.com/index.php/val1/val2
site.com/index.php/val1/val2?get1=val1&get2=val2

Я хочу иметь возможность группировать (/ val1 / val2) независимо от того, что находится слева или справа от uri

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Сначала мы можем попробовать разбить строку на ?, чтобы удалить строку запроса, если она существует.Затем разделите на / разделитель пути и получите доступ к двум последним путям:

$url = "site.com/index.php/val1/val2?get1=val1&get2=val2";
$url = explode('?', $url)[0];
$paths = explode('/', $url);

echo "second to last element: " . $paths[count($paths)-2] . "\n";
echo "last element: " . $paths[count($paths)-1];

Это напечатает:

second to last element: val1
last element: val2

В этом ответе полностью исключено регулярное выражение, что может привести к несколько лучшемупроизводительность.

2 голосов
/ 05 июля 2019

Вы можете использовать

(?:/[^/?#]+){2}(?=[?#]|$)

См. Демоверсию regex

Подробности

  • (?:/[^/?#]+){2}- два повторения /, а затем 1+ символов, отличных от /, ? и #
  • (?=[?#]|$) - положительный прогноз, который соответствует местоположению, за которым сразу следует ?, # или конец строки.

Вот график регулярных выражений :

enter image description here

PHP код :

$re = '~(?:/[^/?#]+){2}(?=[?#]|$)~';
$str = 'site.com/val1/val2';
if (preg_match($re, $str, $match)) {
   print_r($match[0]);
} // => /val1/val2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...