我在正则表达式中匹配对。 $pairs[1]
将包含=
之前的部分,$pairs[2]
将包含=
之后的部分。
当它到达&startrow
时,它应该开始跳过休息并开始制作另一对。
$query= "link=http://abcd.com&efgh&lmkn&startrow=20"
preg_match_all('/(\w+)=([^&startrow]+)/', $query, $pairs);
上述正则表达式在&
处停止,但在&startrow
预期产出
$pairs[1][0] = link
$pairs[2][0] = http://abcd.com&efgh&lmkn
$pairs[1][1] =startrow
$pairs[2][1] =20
答案 0 :(得分:2)
你不需要正则表达式;你需要parse_str():
$ php -a Interactive mode enabled php > $params = null; php > parse_str('link=http://abcd.com&efgh&lmkn&startrow=20', $params); php > var_dump($params); php shell code:1: array(4) { 'link' => string(15) "http://abcd.com" 'efgh' => string(0) "" 'lmkn' => string(0) "" 'startrow' => string(2) "20" }
答案 1 :(得分:1)
我不知道为什么那会有意义,但假设你所要求的一切都很好并且有效,你可以做一些简单明了的事情;)
$_GET_RAW = [];
if (!empty($_SERVER['QUERY_STRING'])) {
// split query string into key value pairs
foreach (explode('&', $_SERVER['QUERY_STRING']) as $keyValueString) {
// separate key and value
list($key, $value) = explode('=', $keyValueString);
$_GET_RAW[$key] = $value;
}
}
答案 2 :(得分:1)
使用以下正则表达式:
preg_match_all('~(\w+)=((?:(?!&startrow).)+)~', $str, $matches, PREG_SET_ORDER);
您可以分别捕捉这两个部分:
Array
(
[0] => Array
(
[0] => link=http://abcd.com&efgh&lmkn
[1] => link
[2] => http://abcd.com&efgh&lmkn
)
[1] => Array
(
[0] => startrow=20
[1] => startrow
[2] => 20
)
)
PHP输出:
case