如果你想从 URL 中移除 page=0page=负数 或任何指定的 page 参数,可以使用 preg_replace() 进行正则匹配和替换。以下是几种情况的解决方案:

1. 移除 page=0 或 page=负数

如果 $cPage 是当前页码(可能是 0 或负数),并且你想从 URL 中移除 page=xxx(其中 xxx 是 0 或负数),可以使用:

$url = "index.php?page=0&foo=bar";
$cPage = 0; // 或 -1, -2 等

// 匹配 page=0 或 page=负数,并移除
$newUrl = preg_replace('/([&?])page=-?\d+(&|$)/', '$1', $url);

// 处理可能的残留 ? 或 &
$newUrl = rtrim($newUrl, '?&');
$newUrl = str_replace('?&', '?', $newUrl);

echo $newUrl; // 输出: index.php?foo=bar

正则解析

  • ([&?]) → 匹配 ? 或 &(捕获到第1组)。

  • page=-?\d+ → 匹配 page=0page=-1page=123 等。

  • (&|$) → 匹配后面的 & 或字符串结尾(捕获到第2组)。

  • 替换为 $1,即保留原来的 ? 或 &,但移除 page=xxx

  • rtrim 和 str_replace 用于清理残留的 ? 或 &

2. 仅移除 page=0(不处理负数)

如果只想移除 page=0,但保留 page=-1 或 page=1

$newUrl = preg_replace('/([&?])page=0(&|$)/', '$1', $url);
$newUrl = rtrim($newUrl, '?&');
$newUrl = str_replace('?&', '?', $newUrl);

3. 移除 page=xxx(无论 xxx 是什么值)

如果想移除 page=xxx(不管 xxx 是正数、负数还是 0):

$newUrl = preg_replace('/([&?])page=[^&]*(&|$)/', '$1', $url);
$newUrl = rtrim($newUrl, '?&');
$newUrl = str_replace('?&', '?', $newUrl);

4. 使用 parse_url + parse_str 更安全地处理

如果 URL 结构复杂,更推荐使用 PHP 内置函数解析和修改:

$url = "index.php?page=0&foo=bar";
$parsed = parse_url($url);
parse_str($parsed['query'] ?? '', $queryParams);

// 移除 page 参数(如果是 0 或负数)
if (isset($queryParams['page']) && $queryParams['page'] <= 0) {
    unset($queryParams['page']);
}

// 重新构建 URL
$newQuery = http_build_query($queryParams);
$newUrl = $parsed['path'] . ($newQuery ? "?$newQuery" : "");

echo $newUrl; // 输出: index.php?foo=bar

总结

需求 正则方案 推荐方法
移除 page=0 或 page=负数         `preg_replace('/([&?])page=-?\d+(&)/′,′)/′,′1', $url)`                 ✅ 适用于简单场景
仅移除 page=0 `preg_replace('/([&?])page=0(&)/′,′)/′,′1', $url)` ✅ 精准匹配 0
移除所有 page=xxx `preg_replace('/([&?])page=[^&]*(&)/′,′)/′,′1', $url)` ⚠️ 会移除所有 page
复杂 URL 处理 parse_url + parse_str + http_build_query ✅ 最安全可靠

推荐使用 方法4(parse_url + parse_str,因为它更健壮,能正确处理各种 URL 结构。