using WishCow and sgehrig's suggestion, here is a test:
(assuming no anchor for the URL)
<?php
    echo "<pre>\n";
    function adjustParam($url, $s) {  
     if (preg_match('/(.*?)\?/', $url, $matches)) $urlWithoutParams = $matches[1];
     else $urlWithoutParams = $url; 
     parse_str(parse_url($url, PHP_URL_QUERY), $params);
     if (strpos($s, '=') !== false) {
      list($var, $value) = split('=', $s);
      $params[$var] = urldecode($value);
      return $urlWithoutParams . '?' . http_build_query($params);      
     } else {
      unset($params[$s]);
      $newQueryString = http_build_query($params);
      if ($newQueryString) return $urlWithoutParams . '?' . $newQueryString;      
      else return $urlWithoutParams;
     }
    }
    function addParam($url, $s) {
     return adjustParam($url, $s);
    }
    function delParam($url, $s) {
     return adjustParam($url, $s);    
    }
    echo "trying add:\n";
    echo addParam("http://www.somesite.com/print.php", "mode=3"), "\n";
    echo addParam("http://www.somesite.com/print.php?", "mode=3"), "\n"; 
    echo addParam("http://www.somesite.com/print.php?newUser=1", "mode=3"), "\n";
    echo addParam("http://www.somesite.com/print.php?newUser=1&fee=0", "mode=3"), "\n";
    echo addParam("http://www.somesite.com/print.php?newUser=1&fee=0&", "mode=3"), "\n";
    echo addParam("http://www.somesite.com/print.php?mode=1", "mode=3"), "\n";  
    echo "\n", "now trying delete:\n";
    echo delParam("http://www.somesite.com/print.php?mode=1", "mode"), "\n";   
    echo delParam("http://www.somesite.com/print.php?mode=1&newUser=1", "mode"), "\n";     
    echo delParam("http://www.somesite.com/print.php?mode=1&newUser=1", "newUser"), "\n";   
?>
and the output is:
trying add:
http://www.somesite.com/print.php?mode=3
http://www.somesite.com/print.php?mode=3
http://www.somesite.com/print.php?newUser=1&mode=3
http://www.somesite.com/print.php?newUser=1&fee=0&mode=3
http://www.somesite.com/print.php?newUser=1&fee=0&mode=3
http://www.somesite.com/print.php?mode=3
now trying delete:
http://www.somesite.com/print.php
http://www.somesite.com/print.php?newUser=1
http://www.somesite.com/print.php?mode=1