por pasar online especiales espacios ejemplo con caracteres php url string

pasar - url encode php



Manipular una cadena url agregando parĂ¡metros GET (14)

Aquí hay una versión más corta de la respuesta aceptada:

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

Editar: como se discutió en la respuesta aceptada, esto tiene fallas porque no verifica si la category ya existe. Una mejor solución sería tratar $_GET por lo que es, una matriz, y usar funciones como in_array() .

Quiero agregar parámetros GET a las URL que pueden y no pueden contener parámetros GET sin repetir ? o &

Ejemplo:

Si quiero agregar category=action

$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

Si nota que estoy tratando de no repetir el signo de interrogación si se encuentra.

La URL es solo una cadena.

¿Cuál es una forma confiable de agregar un parámetro GET específico?


Creo que deberías hacer algo como esto.

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;



Después de buscar muchos recursos / respuestas sobre este tema, decidí codificar el mío. Basado en la respuesta de @ TaylorOtwell aquí, así es como proceso la solicitud $ _GET entrante y modifico / manipulo cada elemento.

Suponiendo que la url es: http://domain.com/category/page.php?a=b&x=y Y solo quiero un parámetro para ordenar: o bien desc = column_name o? Asc = column_name. De esta forma, el parámetro url único es suficiente para ordenar y ordenar simultáneamente. Por lo tanto, la URL será http://domain.com/category/page.php?a=b&x=y&desc=column_name en el primer clic de la fila del encabezado de la tabla asociada.

Luego tengo los encabezados de las filas de la tabla que quiero clasificar DESC en mi primer clic, y ASC en el segundo clic del mismo título. (Cada primer clic debe "ORDER BY columna DESC" primero) Y si no hay ordenación, se ordenará por "fecha y luego id" de forma predeterminada.

Puede mejorarlo aún más, como agregar funciones de limpieza / filtrado a cada componente $ _GET, pero la siguiente estructura sienta las bases.

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, ''&'');}

(Puede usar $ _SERVER [SCRIPT_URI] para la URL completa que comienza con http://domain.com )

Luego uso el resultado $ ORDER que obtengo arriba, en la consulta MySQL:

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

Ahora la función para ver la URL es si hay un parámetro de clasificación y agregación (y ordenación) anterior a la URL con "?" o "&" según la secuencia:

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"; } } }

Finalmente, el encabezado de la fila de la tabla para usar la función:

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

Resumen: esto leerá la URL, modificará cada uno de los componentes $ _GET y creará la URL final con los parámetros de su elección con la forma correcta de uso de "?" y "&"


Ejemplo con actualización de parámetros existentes.

También se utiliza url_encode y la posibilidad de no especificar el valor del parámetro

<? /** * 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; }


Esta función sobrescribe un argumento existente

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 ) ); }


Método básico

$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''; }

Más avanzado

$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''];

Debería poner esto en una función al menos, si no en una clase.


Use strpos para detectar un? Ya que ? solo puede aparecer en la URL al comienzo de una cadena de consulta, ya sabes si ya hay parámetros que ya existen y necesitas agregar parámetros usando &

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


otra versión de función mejorada. Mezcla de respuestas existentes con pequeñas mejoras (compatibilidad con puertos) y correcciones de errores (comprobación de claves correctamente).

/** * @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; }


/** * @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; }


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; }


$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


$parameters = array(); foreach ($get as $key => $value) { $parameters[] = $key.''=''.$value; } $url = ''http://example.com/movies?''.implode(''&'', $parameters);


<?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";