【问题标题】:Unsolved issue with str_replace in PHPPHP中str_replace的未解决问题
【发布时间】:2019-06-08 06:50:55
【问题描述】:

(对不起...“_”在此帖子标题中的 str(和)replace 之间不接受)

我已经好几年没有做过任何正则表达式的事情了,并且陷入了僵局,试图弄清楚该怎么做。

然后我遇到了一个使用 str_replace 作为可能选项的代码 sn-p,并决定试一试。现在我在“StucksVille”。

目标是将 Java 应用程序的传入数据重新格式化为 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

【问题讨论】:

  • 你能解释一下那些到处都是\x 的人应该达到什么目的吗?
  • 我认为你只需要从你对str_replace的所有调用中删除\x
  • 为什么需要str_replace()?您的输入字符串是查询字符串的片段,它是 URL 编码的。使用urldecode() 获取实际值,然后根据需要进行处理:3v4l.org/5OcB5
  • 为什么不使用 urldecode ?
  • @axiac 您应该将其发布为答案

标签: php regex str-replace


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多