不太了解这一点。我希望从网址获取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))
答案 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]
中被捕获了,如果它不是为了一些重要的细节:
模式need to be enclosed in delimiters。在你的情况下,你要使用斜杠,但忘记用相同的分隔符关闭模式。但是,由于您也尝试匹配斜杠,您需要转义模式内的斜杠(使用反斜杠)或使用另一个分隔符({{1}例如)。
~
中的实际字符串可能以斜杠开头,因为模式的开头定义为$pathInfo
(含义:开始模式(/^shop ...
);启动匹配字符串的开头(/
);在字符串的开头找到^
),它不会与您的输入匹配。
所以,把它全部搞定;如果您将模式调整为:
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];