Замена обратной косой черты другим символом в PHP

Пытался заменить обратную косую черту другим символом, таким как «.-.» просто чтобы указать положение обратной косой черты, поскольку я не мог отправить строку, такую ​​​​как «C\xampp\etc». через url как переменную GET, поэтому я подумал, что сначала заменю обратную косую черту в этой строке другим символом, затем отправлю через URL-адрес, а затем заменю их обратно на обратную косую черту в файле PHP, который ее обрабатывает. Хотя был бы лучший способ отправить такие строки через URL-адрес? Потому что, когда я пробую скрипт, такой как:

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

Получается ошибка php, так как \ также используется в качестве разделителя..

Может ли кто-нибудь помочь мне в этом?

Заранее спасибо!

Кстати, если бы я мог отправить полный массив через URL-адрес, вся эта проблема была бы решена, но я не думаю, что это возможно?


person Skyfe    schedule 20.03.2010    source источник


Ответы (4)


Регулярное выражение, используемое в preg_replace, должно быть заключено в пару разделителей, а также попробуйте использовать \\\ вместо \ как:

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

ИЗМЕНИТЬ:

Чтобы отменить замену, вы можете сделать:

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

Вам нужно избежать ., чтобы соответствовать буквальной точке.

person codaddict    schedule 20.03.2010
comment
Обновление: как бы я изменил это? - person Skyfe; 20.03.2010

используйте urlencode()/urldecode().

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

Кстати: это звучит как огромный недостаток безопасности (отправка абсолютных путей по запросу)


PS: preg_replace() для регулярных выражений. Попробуйте str_replace() в следующий раз.

person Philippe Gerber    schedule 20.03.2010

Кстати, если бы я мог отправить полный массив через URL-адрес, вся эта проблема была бы решена, но я не думаю, что это возможно?

Это просто. PHP:

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

Или Javascript:

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

(для Javascript вам нужно будет проверить правильность encodeURIComponent, а также вам понадобится официальная библиотека JSON)

person Bart van Heukelom    schedule 20.03.2010

Если вы не используете регулярное выражение (которое вы не используете), вы должны использовать вместо него str_replace:

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

Обратите внимание, что вы должны экранировать \ другим \ (иначе он будет экранировать следующий ').

Что касается ошибки разделителя - регулярные выражения нужно заключать в разделители, например /foo/ (/ разделитель, foo шаблон). Но, опять же, вам не нужно использовать регулярные выражения или беспокоиться о них.

person Chris    schedule 20.03.2010