php正则表达式用于检测URL URI

时间:2019-07-05 10:37:33

标签: php regex

我正在尝试检测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

无论uri左侧还是右侧,我都希望能够对(/ val1 / val2)进行分组

2 个答案:

答案 0 :(得分:2)

您可以使用

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

请参见regex demo

详细信息

  • (?:/[^/?#]+){2}-两次重复/,然后重复1个以上的字符,而不是/?#
  • (?=[?#]|$)-与位置相匹配的正向超前,其后紧跟?#或字符串结尾。

这里是regex graph

enter image description here

PHP code

$re = '~(?:/[^/?#]+){2}(?=[?#]|$)~';
$str = 'site.com/val1/val2';
if (preg_match($re, $str, $match)) {
   print_r($match[0]);
} // => /val1/val2

答案 1 :(得分:2)

我们可以首先尝试在?上拆分字符串,以删除查询字符串(如果存在)。然后,用/路径分隔符分割并访问最后两个路径:

$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

此答案避免完全使用正则表达式,这可能会导致性能稍好。