2010-03-20 4 views
3

Vous avez eu du mal à remplacer une barre oblique inverse par un autre symbole tel que '.-.' juste pour indiquer la position des barres obliques inverses car je ne pouvais pas envoyer une chaîne comme 'C \ xampp \ etc.' via url en tant que variable GET, je pensais donc remplacer les barres obliques inverses dans cette chaîne par un autre symbole, puis envoyer via url, puis les remplacer par des antislashs dans le fichier PHP qui le gère. Bien qu'il y aurait une meilleure façon d'envoyer de telles chaînes via url? Parce que quand je tente un script tel que:Remplacer la barre oblique inverse par un autre symbole dans PHP

$tmp_name = preg_replace("\", ".-.", $_FILES['uploadfile']['tmp_name']); 

Il se trouve dans une erreur php comme \ est également utilisé comme séparateur ..

Quelqu'un pourrait-il me aider à ce sujet?

Merci d'avance! Btw, si je serais en mesure d'envoyer un tableau complet à travers l'URL, tout ce problème serait résolu, mais je ne pense pas que ce soit possible?

Répondre

4

Le regex utilisé dans preg_replace doit être enfermé dans une paire de delimiter et également essayer d'utiliser \\\ au lieu de \ comme:

$tmp_name = preg_replace("{\\\}", ".-.", $_FILES['uploadfile']['tmp_name']); 

EDIT:

Pour inverser la substitution que vous pouvez faire:

$str = preg_replace('{\.-\.}',"\\",$str); 

Vous devez échapper à la . pour correspondre un point littéral.

+0

Impressionnant! Cela a totalement résolu mon problème, merci beaucoup! – Skyfe

+0

Mise à jour: comment inverserais-je cela? – Skyfe

+0

@Skyfe: Mise à jour de la réponse. – codaddict

3

utilisez urlencode()/urldecode().

echo urlencode('C:\xampp\etc'); // C%3A%5Cxampp%5Cetc 

BTW: Cela ressemble à une énorme faille de sécurité (envoyer des chemins absolus sur demande)


PS: preg_replace() est pour les expressions régulières. Essayez str_replace() la prochaine fois.

+0

+1 La bonne réponse, à mon humble avis. –

0

Si vous n'êtes pas en utilisant une expression régulière (que vous n'êtes pas), vous devez utiliser str_replace à la place:

$tmp_name = str_replace('\\', '.-.', $_FILES['...']);

Notez que vous devez échapper à la \ avec un autre \ (sinon ce serait échapper le suivant ').

En ce qui concerne l'erreur de délimitation - expressions régulières doivent être enfermés dans délimiteurs, par exemple /foo/ (/ est le séparateur, foo est le motif). Mais, encore une fois, il n'y a pas besoin si je serais en mesure d'envoyer une gamme complète par url, tout ce problème serait résolu pour vous d'utiliser ou de se soucier regexps

1

BTW, mais je ne pense pas c'est possible?

C'est facile.PHP:

$url = 'http://example.com/?array=' . urlencode(serialize($array)); // html 
$array = unserialize($_GET['array']); // server side 

ou Javascript:

url = "http://example.com/?array=" + encodeURIComponent(JSON.stringify(array)); // client 
$array = json_decode($_GET['array']); // server 

(pour Javascript, vous devrez rechercher si encodeURIComponent est correct, et vous avez besoin de la bibliothèque JSON officielle ainsi)

Questions connexes