在 & 但不是 && 处拆分字符串

Split a string at & but not &&

我有一个包含 &&& 的 URI,我只需要在单个 & 分隔符处将它拆分成一个数组,例如query1=X&query2=A&&B&query3=Y

应该打印出来

array(
0   =>  query1=X
1   =>  query2=A&&B
2   =>  query3=Y
)

我知道我可以使用 preg_split 但不知道正则表达式。有人可以帮忙吗?

with preg_match_all (不是孤立的&符号):

preg_match_all('~[^&]+(?:&&[^&]*)*|(?:&&[^&]*)+~', $uri, $result);

with preg_split (向前和向后检查 lookarounds):

$result = preg_split('~(?<!&)(?:&&)*+\K&(?!&)~', $uri);

(当有“&&”时强制模式失败)

$result = preg_split('~&(?:&(*SKIP)(*F))?~', $uri);

没有正则表达式(将“&&”翻译成另一个字符并展开)

$result = explode('&', strtr($uri, ['%'=>'%%', '&&'=>'%']));
$result = array_map(function($i) { return strtr($i, ['%%'=>'%', '%'=>'&&']); }, $result);

另一个预分裂:

preg_split("/(?<!&)&(?!&)/",$uri)

(抓取一个不跟在和号之前或之前的和号)