PHP中的str_replace未解决问题

时间:2019-01-14 09:39:21

标签: php regex str-replace

(抱歉,在此发布标题中,“ _”在str(和)之间不能被接受)

几年来我没有做过任何Regexp的工作,然后陷入僵局,试图弄清楚该怎么做。

然后,我使用str_replace作为可能的选项遇到了一个代码片段,并决定尝试一下。现在我在“ StucksVille”中。

目标是将Java App的传入数据重新格式化为PHP页面,并将数据清理为常规的.csv外观,并将该数据写入服务器上的.csv文件。每个数据记录中有12个字段。

(传入数据) csv = data%2Cdata%2data%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 :(得分:0)

只需使用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

答案 1 :(得分:0)

您不需要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"
}