preg_match get the id from url


preg_match get the id from url

不太明白。我希望从url获得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];

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

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

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

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

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

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

10.54

…完整匹配的10.54将在$matches[0]中,而子模式匹配的.54将在$matches[1]中。

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

  1. 模式需要用分隔符括起来。在您的示例中,您要使用斜杠,但忘记使用相同的分隔符关闭模式。然而,由于您也在尝试匹配斜杠,因此您要么需要转义模式内的斜杠(使用反斜杠),要么使用另一个分隔符(例如~)

  2. $pathInfo中的实际字符串可能以斜杠和开始,因为模式的开始被定义为/^shop ...(意思是:开始模式(/);从字符串的开头开始匹配(^);如果在字符串的开头找到shop),它将不匹配您的输入

四舍五入;如果你将你的模式调整为:

~^/shop/product/view?id=('d+)~

…那么$matches[1]将保留您正在寻找的id值(假设我的假设是正确的,并且URL的格式一致)。

说了这么多,鬼的建议可能不是一个坏主意。因为当id实际上在实际URL的另一个地方时,会发生什么?当然,也有许多方法可以用正则表达式捕获这个问题,但是Ghost的建议可能同样可靠,如果不是更可靠的话。

在你的代码中,你也可以这样做,使用爆炸函数

$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];

这是一个将查询字符串保存在关联数组中的实现。请记住,大多数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"
}