6
votes

Remplacement d'une partie spécifique d'une chaîne de requête PHP

J'utilise $ _ serveur ['Query_string'] pour obtenir la piqûre de requête.

Un exemple serait a = 123 & b = 456 & c = 789

Comment pourrais-je supprimer la valeur B de la chaîne de requête pour obtenir A = 123 et C = 789 où b peut être n'importe quelle valeur de n'importe quelle longueur et est alpha numérique.

Des idées appréciées, merci.


6 commentaires

Alors rock mais tu n'es pas. Parce que vous avez accepté une solution qui ne remplacera pas de nombreux types de données.


@Col. Shrapnel: quel type de données la solution ne pourrait pas remplacer? L'OP pourrait alors être intéressé par le cas où les paramètres de requête contiennent uniquement des chiffres (comme indiqué dans l'exemple requête); Si tel est le cas, la solution proposée fonctionnerait.


@kiamlaluno Eh bien si vous prenez ce site comme "Répondons à chaque question boiteux et oublions-le" c'est O.K. Mais quelqu'un pense à ce site comme une source de connaissances ultime, où les réponses peuvent être utilisées plus d'une fois


@pondpad: Voir les commentaires à ma réponse ( Stackoverflow.com/Questtions/3308711#Comments-3308749 ).


@Col. Shrapnel: la question est spécifique; Je ne pense pas que quelqu'un puisse dire que les réponses données ici sont généralement valables. De manière générale, la réponse donnée à une question n'a pas pu être valable dans d'autres cas; Si dans un cas, la solution consiste à utiliser des expressions régulières, cela ne signifie pas que les expressions régulières doivent toujours être utilisées.


@Col. Shrapnel Ne pleure pas, cela convient à mes besoins. Bien sûr, c'est ma responsabilité d'envisager un codage et tout autre exploits. Il est sûrement ridicule de s'attendre à une solution complète qui convient à tout cas. J'ai demandé à la quête de penser que j'avais probablement besoin de regex quand j'avais besoin de l'enfer de beaucoup plus simple. Laissez-moi reformuler mon commentaire précédent. La plupart des gens à la pile dépassant la roche, j'apprécie à quel point les gens tentent d'essayer et d'entrer dans les détails. Cependant, bien sûr, certaines personnes passent leur temps à la traîne dans les commentaires.


7 Réponses :


1
votes

Vous faites simplement une variable à l'aide de € _ get code> et excluez B code> String de requête dans le processus de construction:

$query_string_new = 'a=' . urlencode($_GET['a']) . '&c=' . urlencode($_GET['c']);


4 commentaires

N'oubliez pas d'échapper à la sortie correctement.


Et si a et c ne sont pas des valeurs décimales?


@Gumbo: Que voulez-vous dire exactement?, Demandez-vous ou devez-vous suggérer quelque chose ici?


@SAC: Si vous utilisez urlencode au lieu de intval , il peut être utilisé sur toutes les valeurs.



3
votes

Essayez ceci:

$query_new = preg_replace('/(^|&)b=[^&]*/', '', $query);


10 commentaires

Quelle est la raison du vote en panne? Et s'il vous plaît ne dites pas "Oh, vous utilisez des expressions régulières! Quel mauvais!"


L'utilisation d'une expression régulière permettrait de remplacer le paramètre quelle que soit la position qu'il a dans la chaîne de requête. Str_replace ('& B ='. $ _ Obtenez ['B'], '', $ _Server ['Query_string']) ne le remplace pas si c'est le premier paramètre de la chaîne de requête.


@Kiamlaluno: Exactement. C'est pourquoi j'ai choisi une recherche d'expression régulière.


Imaginez que nous avons $ _ obtenez ['B'] = "Remplacement direct parfois échoue";


@Gumbo: Je suppose que parfois le code montré à partir de qui crée la question est prise trop littéralement; Le fait que le paramètre B est affiché en deuxième position ne signifie pas qu'il devrait toujours être toujours en deuxième position. L'OP demande à supprimer ce paramètre, mais il ne dit pas que c'est toujours le deuxième paramètre, ni ce n'est jamais le premier paramètre. C'est pourquoi je pense que votre réponse est valide comme d'autres réponses. Si alors l'OP préfère un tableau au lieu d'une chaîne, c'est quelque chose que l'OP devrait signaler.


@Col. Shrapnel: / [^ &] * / correspond à "Remplacement direct Parfois échoue", ainsi que "Direct + Remplacer + parfois + échec"; Je ne vois pas de quoi votre objection est.


@KIAMLALUNO: Je pense que le commentaire de Col. Shrapnel était d'aborder la faille La réponse acceptée a besoin de la valeur à non-accoûtée. En face de cela si $ _ get ['b'] est égal à Remplacement direct parfois La valeur de la chaîne de requête peut être soit direct + remplacer + parfois + , direct% 20replace% 20somemines% 20Fail ou même une combinaison de + et % 20 mais il n'est jamais Remplacer directement parfois échouer .


@Gumbo: Comme vous avez proposé d'utiliser Preg_replace () , je prends que la variable $ requis Vous vous référez à une copie de $ _ serveur ['Query_string' ] ; Peut-être que cela devrait être précisé dans votre réponse. La question ne rapporte pas comment le résultat obtenu est utilisé; Comme la question est seulement comment supprimer un paramètre de requête de la chaîne de requête, votre réponse répond à ce que l'OP a demandé. Si lorsqu'il a besoin de ré-encoder la chaîne avant de l'utiliser, c'est une question différente.


@KIAMLALUNO: $ requis peut contenir une chaîne de requête valide. Cette solution ne dépend pas d'une chaîne de requête réellement demandée qui est analysée par PHP à l'avance pour obtenir un tableau de ses paramètres (c'est-à-dire $ _ obtenir ) comme d'autres suggestions. Et il ne nécessite aucun ordre de présence ou de paramètre spécifique ni.


@Gumbo: Je n'ai pas dit que votre réponse n'était pas correcte. Je dis simplement que le commentaire de Col. Shrapnel n'a pas de sens pour votre réponse.



10
votes

La valeur va être $ _ obtenir ['B'] code>.

Du: P>

str_replace('&b='.$_GET['b'], '', $_SERVER['QUERY_STRING']);


4 commentaires

Im aimant celui-ci. Merci.


Cette solution échoue si la valeur contient des caractères à encoder. Voir le commentaire de Col. Shrapnel dans les commentaires à ma réponse (voir Stackoverflow.com/questions/3308711#Comment-3428781 ) à titre d'exemple.


Ah oui. Mais vous pourriez résoudre ce problème assez facile en enveloppant $ _GET ['B'] dans une truc de décodage.


Et s'il existe un ? avant b = ?



15
votes

Une solution à l'aide d'une analyse d'URL:

parse_str($_SERVER['QUERY_STRING'], $result_array);
unset($result_array['b']);
$_SERVER['QUERY_STRING'] = http_build_query($result_array);


2 commentaires

Quelque chose comme ça, définitivement. Vous pouvez peut-être utiliser le _ get _ get _ get parse_str () : nonset ($ _ obtenir ['B']); $ qs = http_build_query ($ _ obtenir);


La différence est que ma réponse n'affecte que le serveur _ _ «Query_string»] variable et laisse $ _get intact, au cas où elle serait toujours nécessaire pour une raison quelconque.



2
votes

Toutes les réponses ont l'air bien, mais il sera plus flexible si vous faites:

// Make a copy of $_GET to keep the original data
$getCopy = $_GET;
unset($getCopy['b']); // or whatever var you want to take out

// This is your cleaned array
var_dump($getCopy);

// If you need the URL-encoded string, just use http_build_query()
$encodedString = http_build_query($getCopy);


3 commentaires

Dans php 5.3 $ getcopy = $ _GET ne crée pas de copie, mais cela crée une référence à $ _ obtenir . J'ai eu le même problème dans mon code, où je voulais préserver la valeur de $ _ obtenir utilisé pour une autre fonction; J'ai utilisé $ Query = $ _get; nonset ($ requête ['q']; et le résultat a été aussi que l'autre fonction (qui accédait à $ _ get directement) n'a pas été capable de récupérer $ € ['Q'] .


Pour autant que je sache, créer une référence, vous devrez faire $ getcopy = & $ _GET ...


@ilarra: c'est correct; Seuls les objets sont passés par référence, dans PHP 5.3. Je ne peux pas ensuite généraliser le code que j'ai rapporté, même si remplaçant $ Query = $ _GET; nonset ($ requérant ['q']; avec la boucle résolue le problème présent dans mon code.



3
votes

Vous pouvez utiliser cette fonction: xxx pré>

Pour supprimer n'importe quelle touche souhaitée, par exemple p> xxx pré>

résultat p>

http://www.domain.com/?a=b&c=d&e=f&g=h


0 commentaires

0
votes

poire a déjà une classe (net_url2) qui gère l'analyse / bâtiment URL:

Installer via Compositeur: https://packagist.org/packages/pear/net_url2 Installez comme inclus: https://github.com/pear/net_url2/blob /master/net/url2.php p>

Exemple code: P>

$url = new Net_URL2('http://www.example.com/?one=1');
$url->setQueryVariable('two', 2);
echo $url; // http://www.example.com/?one=1&two=2


0 commentaires