preg_match从url获取id

时间:2014-08-03 03:43:51

标签: php

不太了解这一点。我希望从网址获取id。路径看起来像site.com/shop/product/view?id=1&name=name。我也很困惑matches的意思。我阅读了文档和一些网站,我仍然没有得到它。所以喜欢我的$ matches [0]这意味着比赛后的第一个角色。看到一些例子,它看起来不像。

public function parseUrl($manager,$request,$pathInfo,$rawPathInfo){
    if (preg_match('/id=[0-9]*/', $pathInfo, $matches))
            $id = $matches[0];

尝试if (preg_match('/^shop/product/view?id=(\d+)', $pathInfo, $matches))

3 个答案:

答案 0 :(得分:0)

这是一个实现,它将为您提供关联数组中的查询字符串。请记住,大多数http服务器都有一个cgi变量可用作`$ _SERVER [' QUERY_STRING'];

$url = 'site.com/shop/product/view?id=1&name=name';
$url = explode('/', $url);

$last = $url[count($url)-1];

$position = 0;
$query = '';

for($i = 0; $i < strlen($last); $i++) {
  if($last[$i] === '?') {
    $query = substr($last, $i + 1);
    break;
  }
}

$parts = explode('&', $query);
$final = array();

for($i = 0; $i < count($parts); $i++) {
  $data = explode('=', $parts[$i]);
  $final[$data[0]] = $data[1];

}


var_dump($final);

节目输出

array(2) {
  ["id"]=>
  string(1) "1"
  ["name"]=>
  string(4) "name"
}

答案 1 :(得分:0)

当调用preg_match()的默认用法(即没有PREG_OFFSET_CAPTURE标志)时,$matches数组将在$matches[0]中保存完全匹配的模式,并且可选地匹配子模式后续指数。

子模式是在括号中定义的子模式。考虑这个示例模式:

/^\d+(\.\d+)$/

(它尝试匹配十进制数,并捕获子模式中的小数点和后面的数字)

此示例中的第一个(也是唯一的)子模式是(\.\d+)。针对以下字符串调用:

10.54

...完整匹配10.54将位于$matches[0],而子模式匹配.54将位于$matches[1]

在你的上一个例子中,你实际上是在正确的轨道上!你想要的id的价值实际上已经在$matched[1]中被捕获了,如果它不是为了一些重要的细节:

  1. 模式need to be enclosed in delimiters。在你的情况下,你要使用斜杠,但忘记用相同的分隔符关闭模式。但是,由于您也尝试匹配斜杠,您需要转义模式内的斜杠(使用反斜杠)使用另一个分隔符({{1}例如)。

  2. ~中的实际字符串可能以斜杠开头,因为模式的开头定义为$pathInfo(含义:开始模式(/^shop ...);启动匹配字符串的开头(/);在字符串的开头找到^),它不会与您的输入匹配。

  3. 所以,把它全部搞定;如果您将模式调整为:

    shop

    ...然后~^/shop/product/view?id=(\d+)~将保留您正在寻找的$matches[1]值(假设我的假设是正确的,并且网址一直在形成)。

    说完这一切之后,Ghost's suggestion可能不是一个坏主意。因为当id实际位于实际网址中的其他位置时会发生什么?当然,有许多方法可以通过正则表达式来理解这一点,但是Ghost的建议可能就像是可靠的一样。

答案 2 :(得分:0)

使用您的代码,您也可以使用爆炸功能

执行此操作
$url = "site.com/shop/product/view?id=1231&name=name";
if (preg_match('/id=[0-9]*/', $url, $matches))
    $id = $matches[0];

$req_id = explode('=', $id);
echo $req_id[1];