Нерешенная проблема с str_replace в PHP - PullRequest
0 голосов
/ 14 января 2019

(Извините ... "_" не будет принимать вместо str (и) в этом заголовке сообщения)

В течение нескольких лет я ничего не делал в Regexp, и ушел в тупик, пытаясь понять, что делать.

Затем я наткнулся на фрагмент кода с использованием str_replace в качестве возможного варианта и решил попробовать. Сейчас я в "StucksVille".

Цель состоит в том, чтобы переформатировать входящие данные для приложения Java на страницу PHP, очистить данные в обычный внешний вид .csv, а также записать эти данные в файл .csv на сервере. В каждой записи данных 12 полей.

(Входящие данные) CSV = данные% 2Cdata% 2Данные% 2Cdata% 2Cdata% 2Cdata% 2Cdata% 2Cdata% 2Cdata% 2Cdata% 2Cdata% 2Cdata% 0D% 0A

Вот что я пытаюсь сделать:

Delete/Remove beginning csv=
Replace all %2C with , (a comma)
Replace ending %0D with \r  (carriage return)
Replace ending %0A with \n  (newline)

Вот то, что я придумал, но данные файла test.csv по-прежнему выглядят так же, как (неочищенный) оригинальный {SIGH}.

$entityBody = file_get_contents('php://input');

$cleaned1 = str_replace("\xcsv=", "\x", $entityBody);
$cleaned2 = str_replace("\x%2C", "\x,", $cleaned1);
$cleaned3 = str_replace("\x%0D", "\x\r", $cleaned2);
$cleaned4 = str_replace("\x%0A", "\x\n", $cleaned3);

$fp = fopen('test.csv', 'a+');

fwrite($fp, $cleaned4);

fclose($fp);

Любая помощь или руководство приветствуется.

-Stucko

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вам не нужно str_replace() или regex. Ваша входная строка является фрагментом строки запроса, она закодирована в URL, и PHP предоставляет инструменты для ее правильной обработки.

Вы можете использовать urldecode(), чтобы получить фактическое значение, а затем обработать его, как пожелаете:

$input = 'csv=data%2Cdata%2data%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%0D%0A';
echo(urldecode($input));

# The output is:
# csv=data,data-ata,data,data,data,data,data,data,data,data,data

Еще лучше, вы можете использовать parse_str() вместо этого, и он также позаботится о части csv= (потому что это то, что parse_str() делает для жизни; он анализирует строки запроса):

$input = 'csv=data%2Cdata%2data%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%0D%0A';
parse_str($input, $pieces);
var_dump($pieces);

Вывод:

array(1) {
  'csv' =>
  string(60) "data,data-ata,data,data,data,data,data,data,data,data,data
"
}

Если вам также нужно разобрать строку CSV на части, вы можете передать ее в str_getcsv():

$fields = str_getcsv($pieces['csv']);
var_dump($fields);

Выход:

array(11) {
  [0] =>
  string(4) "data"
  [1] =>
  string(8) "data-ata"
  [2] =>
  string(4) "data"
  [3] =>
  string(4) "data"
  [4] =>
  string(4) "data"
  [5] =>
  string(4) "data"
  [6] =>
  string(4) "data"
  [7] =>
  string(4) "data"
  [8] =>
  string(4) "data"
  [9] =>
  string(4) "data"
  [10] =>
  string(4) "data"
}
0 голосов
/ 14 января 2019

Просто используйте urldecode(), который сделает почти все это за вас

$in = 'csv=data%2Cdata%2data%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%2Cdata%0D%0A';
$in = str_replace('csv=', '', $in);
$clean = urldecode($in);
echo $clean;

РЕЗУЛЬТАТ

data,data-ata,data,data,data,data,data,data,data,data,data
...