webentwicklung-frage-antwort-db.com.de

Bearbeiten Sie eine URL-Zeichenfolge, indem Sie GET-Parameter hinzufügen

Ich möchte GET-Parameter zu URLs hinzufügen, die GET-Parameter enthalten können und nicht, ohne ? oder & zu wiederholen.

Beispiel:

Wenn ich category=action hinzufügen möchte

$url="http://www.acme.com";
 // will add ?category=action at the end

$url="http://www.acme.com/movies?sort=popular";
 // will add &category=action at the end

Wenn Sie feststellen, versuche ich, das Fragezeichen nicht zu wiederholen, wenn es gefunden wurde.

Die URL ist nur eine Zeichenfolge.

Was ist ein zuverlässiger Weg, um einen bestimmten GET-Parameter anzufügen?

64
Ryan

Grundmethode

$query = parse_url($url, PHP_URL_QUERY);

// Returns a string if the URL has parameters or NULL if not
if ($query) {
    $url .= '&category=1';
} else {
    $url .= '?category=1';
}

Fortgeschrittener

$url = 'http://example.com/search?keyword=test&category=1&tags[]=fun&tags[]=great';

$url_parts = parse_url($url);
parse_str($url_parts['query'], $params);

$params['category'] = 2;     // Overwrite if exists
$params['tags'][] = 'cool';  // Allows multiple values

// Note that this will url_encode all values
$url_parts['query'] = http_build_query($params);

// If you have pecl_http
echo http_build_url($url_parts);

// If not
echo $url_parts['scheme'] . '://' . $url_parts['Host'] . $url_parts['path'] . '?' . $url_parts['query'];

Sie sollten dies zumindest in eine Funktion schreiben, wenn nicht in eine Klasse.

143
andrewtweber

Hier ist eine kürzere Version der akzeptierten Antwort:

$url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action';

Bearbeiten: Wie in der akzeptierten Antwort besprochen, ist dies fehlerhaft, da nicht geprüft wird, ob category bereits existiert. Eine bessere Lösung wäre, den $_GET für das, was er ist - ein Array - zu behandeln und Funktionen wie in_array() zu verwenden.

40
rybo111
$data = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');

$queryString =  http_build_query($data);
//$queryString = foo=bar&baz=boom&cow=milk&php=hypertext+processor

echo 'http://domain.com?'.$queryString;
//output: http://domain.com?foo=bar&baz=boom&cow=milk&php=hypertext+processor
15
Tom Claus

Diese Funktion überschreibt ein vorhandenes Argument

function addToURL( $key, $value, $url) {
    $info = parse_url( $url );
    parse_str( $info['query'], $query );
    return $info['scheme'] . '://' . $info['Host'] . $info['path'] . '?' . http_build_query( $query ? array_merge( $query, array($key => $value ) ) : array( $key => $value ) );
}
8
user2171027

Verwenden Sie strpos , um ein? Zu erkennen. Schon seit ? kann nur in der URL am Anfang einer Abfragezeichenfolge angezeigt werden, Sie wissen, ob dort bereits Params vorhanden sind und Sie müssen Params mit & hinzufügen

function addGetParamToUrl(&$url, $varName, $value)
{
    // is there already an ?
    if (strpos($url, "?"))
    {
        $url .= "&" . $varName . "=" . $value; 
    }
    else
    {
        $url .= "?" . $varName . "=" . $value;
    }
}
8
Doug T.

Beispiel mit Aktualisierung vorhandener Parameter.

Außerdem wird url_encode verwendet und es ist nicht möglich, den Parameterwert .__ anzugeben.

    <?
    /**
     * Add parameter to URL
     * @param string $url
     * @param string $key
     * @param string $value
     * @return string result URL
     */
    function addToUrl($url, $key, $value = null) {
        $query = parse_url($url, PHP_URL_QUERY);
        if ($query) {
            parse_str($query, $queryParams);
            $queryParams[$key] = $value;
            $url = str_replace("?$query", '?' . http_build_query($queryParams), $url);
        } else {
            $url .= '?' . urlencode($key) . '=' . urlencode($value);
        }
        return $url;
    }
<?php
$url1 = '/test?a=4&b=3';
$url2 = 'www.baidu.com/test?a=4&b=3&try_count=1';
$url3 = 'http://www.baidu.com/test?a=4&b=3&try_count=2';
$url4 = '/test';
function add_or_update_params($url,$key,$value){
    $a = parse_url($url);
    $query = $a['query'] ? $a['query'] : '';
    parse_str($query,$params);
    $params[$key] = $value;
    $query = http_build_query($params);
    $result = '';
    if($a['scheme']){
        $result .= $a['scheme'] . ':';
    }
    if($a['Host']){
        $result .= '//' . $a['Host'];
    }
    if($a['path']){
        $result .=  $a['path'];
    }
    if($query){
        $result .=  '?' . $query;
    }
    return $result;
}
echo add_or_update_params($url1,'try_count',1);
echo "\n";
echo add_or_update_params($url2,'try_count',2);
echo "\n";
echo add_or_update_params($url3,'try_count',3);
echo "\n";
echo add_or_update_params($url4,'try_count',4);
echo "\n";
4
shengbin_xu

Ich denke, du solltest so etwas tun.

class myURL {
    protected $baseURL, $requestParameters;

    public function __construct ($newURL) {
        $this->baseurl = $newURL;
        $this->requestParameters = array();
    }

    public function addParameter ($parameter) {
        $this->requestParameters[] = $parameter;
    }

    public function __toString () {
        return $this->baseurl.
               ( count($this->requestParameters) ?
                 '?'.implode('&', $this->requestParameters) :
                 ''
                 );
    }
}

$url1 = new myURL ('http://www.acme.com');
$url2 = new myURL ('http://www.acme.com');
$url2->addParameter('sort=popular');
$url2->addParameter('category=action');
$url1->addParameter('category=action');

echo $url1."\n".$url2;
3
Hammerite
$parameters = array();

foreach ($get as $key => $value)
{
     $parameters[] = $key.'='.$value;
}

$url = 'http://example.com/movies?'.implode('&', $parameters);
2
TaylorOtwell
 /**
 * @example addParamToUrl('/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
 * @example addParamToUrl('//example.com/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
 * @example addParamToUrl('https://example.com/path/to/?find=1&FILTER=Y', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
 *
 * @param       $url string url
 * @param array $addParams
 *
 * @return string
 */
function addParamToUrl($url, array $addParams) {
  if (!is_array($addParams)) {
    return $url;
  }

  $info = parse_url($url);

  $query = array();

  if ($info['query']) {
    parse_str($info['query'], $query);
  }

  if (!is_array($query)) {
    $query = array();
  }

  $params = array_merge($query, $addParams);

  $result = '';

  if ($info['scheme']) {
    $result .= $info['scheme'] . ':';
  }

  if ($info['Host']) {
    $result .= '//' . $info['Host'];
  }

  if ($info['path']) {
    $result .= $info['path'];
  }

  if ($params) {
    $result .= '?' . http_build_query($params);
  }

  return $result;
}
2
Londeren

Nachdem ich zu diesem Thema viele Ressourcen/Antworten gesucht hatte, entschied ich mich, meine eigenen zu kodieren. Basierend auf der Antwort von @ TaylorOtwell hier verarbeite ich die eingehende $ _GET-Anfrage und modifiziere/manipuliere jedes Element.

Angenommen, die URL lautet: http://domain.com/category/page.php?a=b&x=y Und ich möchte nur einen Parameter zum Sortieren: Entweder? Desc = spaltenname oder? Asc = spaltenname . Auf diese Weise reicht ein einzelner URL-Parameter aus, um gleichzeitig zu sortieren und zu sortieren. Die URL lautet also http://domain.com/category/page.php?a=b&x=y&desc=column_name , wenn Sie auf die zugehörige Tabellenkopfzeile klicken.

Dann habe ich Tabellenzeilenüberschriften, die ich DESC beim ersten Klick sortieren möchte, und ASC beim zweiten Klick derselben Überschrift. (Jeder erste Klick sollte zuerst "ORDER BY-Spalte DESC" sein.) Wenn keine Sortierung erfolgt, wird standardmäßig nach "Datum, dann ID" sortiert.

Sie können es weiter verbessern, indem Sie jeder $ _GET-Komponente Reinigungs-/Filterfunktionen hinzufügen. Die untenstehende Struktur bildet jedoch die Grundlage.

foreach ($_GET AS $KEY => $VALUE){
    if ($KEY == 'desc'){
        $SORT = $VALUE;
        $ORDER = "ORDER BY $VALUE DESC";
        $URL_ORDER = $URL_ORDER . "&asc=$VALUE";
    } elseif ($KEY == 'asc'){
        $SORT = $VALUE;
        $ORDER = "ORDER BY $VALUE ASC";
        $URL_ORDER = $URL_ORDER . "&desc=$VALUE";
    } else {
        $URL_ORDER .= "&$KEY=$VALUE";
        $URL .= "&$KEY=$VALUE";
    }
}
if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';}
if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');}
if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');}

(Sie können $ _SERVER [SCRIPT_URI] für die vollständige URL verwenden, die mit http://domain.com beginnt.)

Dann verwende ich die resultierende $ ORDER, die ich oben in der MySQL-Abfrage bekomme:

"SELECT * FROM table WHERE limiter = 'any' $ORDER";

Nun die Funktion zum Anzeigen der URL, wenn zuvor ein Sortierparameter (und Sortierparameter) mit "?" Hinzugefügt wurde. oder "&" entsprechend der Reihenfolge:

        function sort_order ($_SORT){
            global $SORT, $URL_ORDER, $URL;
            if ($SORT == $_SORT){
                return $URL_ORDER;
            } else {
                if (strpos($URL, '?') !== false){
                    return "$URL&desc=$_SORT";
                } else {                        
                    return "$URL?desc=$_SORT";
                }
            }
        }

Schließlich den Tabellenzeilenkopf, um die Funktion zu verwenden:

        echo "<th><a href='".sort_order('id')."'>ID</a></th>";

Zusammenfassung: Hiermit wird die URL gelesen, jede $ _GET-Komponente geändert und die endgültige URL mit Parametern Ihrer Wahl mit der korrekten Verwendungsform von "?" und "&"

1
Tarik

Versuchen Sie diese Funktion, um URL-Parameter hinzuzufügen .

Dann können Sie die Verknüpfung deaktivieren, wenn der Parameter so festgelegt ist, dass keine doppelten URL-Parameter vorhanden sind.

<?php
  function addQueryString($a)
                {
             if (empty($_SERVER['QUERY_STRING']))
               return '?' . $a;
             else if (!empty($_SERVER['QUERY_STRING']))
              return '?' . $_SERVER['QUERY_STRING'] . '&' . $a;
                }
?>

 <a href="<?php echo addQueryString('lang=en'); ?>">test</a>
 <a href="<?php echo addQueryString('category=5'); ?>">sat</a>
0
csandreas1

Ich denke, das ist was Sie suchen:

URL-Parameter Regex

0
fingerman
 public function addGetParamToUrl($url, $params)
{
    foreach ($params as $param) {
         if (strpos($url, "?"))
        {
            $url .= "&" .http_build_query($param); 
        }
        else
        {
            $url .= "?" .http_build_query($param); 
        }
    }
    return $url;
}
0
Maor

eine weitere verbesserte Funktionsversion. Mischung aus vorhandenen Antworten mit kleinen Verbesserungen (Port-Unterstützung) und Bugfixes (Schlüssel richtig prüfen).

/**
 * @param string $url original url to modify - can be relative, partial etc
 * @param array $paramsOverride associative array, can be empty
 * @return string modified url
 */
protected function overrideUrlQueryParams($url, $paramsOverride){
    if (!is_array($paramsOverride)){
        return $url;
    }

    $url_parts = parse_url($url);

    if (isset($url_parts['query'])) {
        parse_str($url_parts['query'], $params);
    } else {
        $params = [];
    }

    $params = array_merge($params, $paramsOverride);

    $res = '';

    if(isset($url_parts['scheme'])) {
        $res .= $url_parts['scheme'] . ':';
    }

    if(isset($url_parts['Host'])) {
        $res .= '//' . $url_parts['Host'];
    }

    if(isset($url_parts['port'])) {
        $res .= ':' . $url_parts['port'];
    }

    if (isset($url_parts['path'])) {
        $res .= $url_parts['path'];
    }

    if (count($params) > 0) {
        $res .= '?' . http_build_query($params);
    }

    return $res;
}
0
Roman86