不太明白。我希望从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]
中被捕获了:
-
模式需要用分隔符括起来。在您的示例中,您要使用斜杠,但忘记使用相同的分隔符关闭模式。然而,由于您也在尝试匹配斜杠,因此您要么需要转义模式内的斜杠(使用反斜杠),要么使用另一个分隔符(例如
~
) 。 -
$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"
}