str_replace无法按预期工作 - 多字节字符集?

时间:2017-02-18 22:24:23

标签: php arrays str-replace

我在数组$a2中有空格问题。我想将" "替换为""

我试过

$a2 = str_replace(" ", "", $a2);

甚至:

function str_replace_json($search, $replace, $subject) {
    return json_decode(str_replace($search, $replace, json_encode($subject)), true);
}
$a2 = str_replace_json(" ", "", $a2);

但是它只在数字之前和之后(不在内部)修剪空格。

我的阵列:

$a2 =  array( $rowData[3][1], 
              $rowData[3][2], 
              $rowData[3][3], 
              $rowData[3][4], 
              $rowData[3][5], 
              $rowData[3][6], 
              $rowData[3][7]
            );

我的数组的var_dump:

array(7) {  [0]=> string(54) " 155 808.00 " 
            [1]=> string(54) " 131 256.00 " 
            [2]=> string(54) " 106 008.00 " 
            [3]=> string(53) " 60 600.00 " 
            [4]=> string(53) " 41 520.00 " 
            [5]=> string(52) " 5 880.00 " 
            [6]=> string(52) " 6 744.00 " 
        }

可能是什么原因?

修改 当我以这种方式取消我的阵列时:

$a2 = array(
  " 155 808.00 ",
  " 131 256.00 ", 
  " 106 008.00 ", 
  " 60 600.00 ", 
  " 41 520.00 ", 
  " 5 880.00 ", 
  " 6 744.00 " 
);

我可以轻松修剪所有空格(包括数字内部的空格)。

这就是我创建$rowData

的方式
include_once ("includes/php/simple_html_dom.php");
$html = file_get_html('https://gaz.tge.pl/pl/rdn/gas/index/index/');
$table = $html->find("table[@class=t-02]",0);
$rowData = array();
foreach($table->find('tr') as $row) {
    $data = array();
    foreach($row->find('td') as $cell) {
           $data[] = $cell->plaintext;
    }
    $rowData[] = $data;
}
array_unshift($rowData[0], "RDNpg");
var_dump

$rowData

array(7) { [0]=> array(8) { [0]=> string(5) "RDNpg" [1]=> string(68) " Pn. 13/02 " [2]=> string(68) " Wt. 14/02 " [3]=> string(69) " Śr. 15/02 " [4]=> string(68) " Cz. 16/02 " [5]=> string(68) " Pt. 17/02 " [6]=> string(68) " So. 18/02 " [7]=> string(67) " N. 19/02 " } [1]=> array(1) { [0]=> string(40) " TGEgasDA " } [2]=> array(8) { [0]=> string(8) "PLN/MWh " [1]=> string(44) " 92.56 " [2]=> string(44) " 91.36 " [3]=> string(44) " 89.51 " [4]=> string(44) " 87.62 " [5]=> string(44) " 88.01 " [6]=> string(44) " 84.63 " [7]=> string(44) " 84.90 " } [3]=> array(8) { [0]=> string(4) "MWh " [1]=> string(54) " 155 808.00 " [2]=> string(54) " 131 256.00 " [3]=> string(54) " 106 008.00 " [4]=> string(53) " 60 600.00 " [5]=> string(53) " 41 520.00 " [6]=> string(52) " 5 880.00 " [7]=> string(52) " 6 744.00 " } [4]=> array(1) { [0]=> string(40) " TGEsgtDA " } [5]=> array(8) { [0]=> string(8) "PLN/MWh " [1]=> string(40) " - " [2]=> string(40) " - " [3]=> string(40) " - " [4]=> string(40) " - " [5]=> string(40) " - " [6]=> string(40) " - " [7]=> string(40) " - " } [6]=> array(8) { [0]=> string(4) "MWh " [1]=> string(40) " - " [2]=> string(40) " - " [3]=> string(40) " - " [4]=> string(40) " - " [5]=> string(40) " - " [6]=> string(40) " - " [7]=> string(40) " - " } } array(7) { [0]=> string(54) " 155 808.00 " [1]=> string(54) " 131 256.00 " [2]=> string(54) " 106 008.00 " [3]=> string(53) " 60 600.00 " [4]=> string(53) " 41 520.00 " [5]=> string(52) " 5 880.00 " [6]=> string(52) " 6 744.00 " } 

json_encode($rowData);

[["RDNpg"," \t Pn. \t 13\/02 \t "," \t Wt. \t 14\/02 \t "," \t \u015ar. \t 15\/02 \t "," \t Cz. \t 16\/02 \t "," \t Pt. \t 17\/02 \t "," \t So. \t 18\/02 \t "," \t N. \t 19\/02 \t "],[" \t TGEgasDA \t "],["PLN\/MWh "," \t 92.56 \t "," \t 91.36 \t "," \t 89.51 \t "," \t 87.62 \t "," \t 88.01 \t "," \t 84.63 \t "," \t 84.90 \t "],["MWh "," \t 155 808.00 \t "," \t 131 256.00 \t "," \t 106 008.00 \t "," \t 60 600.00 \t "," \t 41 520.00 \t "," \t 5 880.00 \t "," \t 6 744.00 \t "],[" \t TGEsgtDA \t "],["PLN\/MWh "," \t - \t "," \t - \t "," \t - \t "," \t - \t "," \t - \t "," \t - \t "," \t - \t "],["MWh "," \t - \t "," \t - \t "," \t - \t "," \t - \t "," \t - \t "," \t - \t "," \t - \t "]]

编辑2 我使用bin2hex()查看$a2数组中的内容。我得到了:

20200920202020202020202020202020202020313535266e6273703b3830382e30302020200920202020202020202020202020202020
20200920202020202020202020202020202020313331266e6273703b3235362e30302020200920202020202020202020202020202020
20200920202020202020202020202020202020313036266e6273703b3030382e30302020200920202020202020202020202020202020
202009202020202020202020202020202020203630266e6273703b3630302e30302020200920202020202020202020202020202020
202009202020202020202020202020202020203431266e6273703b3532302e30302020200920202020202020202020202020202020
2020092020202020202020202020202020202035266e6273703b3838302e30302020200920202020202020202020202020202020
2020092020202020202020202020202020202036266e6273703b3734342e30302020200920202020202020202020202020202020

我是否正确,神秘的空间是不间断的空间 ,这就是为什么具有正常空间的修剪功能不起作用的原因?

4 个答案:

答案 0 :(得分:2)

试试这个:

<?php

$rowData = array(
    array(
        "RDNpg",
        " Pn. 13/02 ",
        " Wt. 14/02 ",
        " Śr. 15/02 ",
        " Cz. 16/02 ",
        " Pt. 17/02 ",
        " So. 18/02 ",
        " N. 19/02 ",
    ),
    array(" TGEgasDA "),
    array(
        "PLN/MWh ",
        " 92.56 ",
        " 91.36 ",
        " 89.51 ",
        " 87.62 ",
        " 88.01 ",
        " 84.63 ",
        " 84.90 "),
    array(
        "MWh ",
        " 155 808.00 ",
        " 131 256.00 ",
        " 106 008.00 ",
        " 60 600.00 ",
        " 41 520.00 ",
        " 5 880.00 ",
        " 6 744.00 "
    ),
    array(
        " TGEsgtDA ",
    ),
    array(
        "PLN/MWh ",
        " - ",
        " - ",
        " - ",
        " - ",
        " - ",
        " - ",
        " - "
    ),
    array(
        "MWh ",
        " - ",
        " - ",
        " - ",
        " - ",
        " - ",
        " - ",
        " - "
    )
);

$a2 = array($rowData[3][1], $rowData[3][2], $rowData[3][3], $rowData[3][4], $rowData[3][5], $rowData[3][6], $rowData[3][7]);

function trimmed($item)
{
    return str_replace(" ", "", $item);
}

$a2trim = array_map('trimmed', $a2);
var_dump($a2trim);

这是输出:

array(7) {
  [0]=>
  string(9) "155808.00"
  [1]=>
  string(9) "131256.00"
  [2]=>
  string(9) "106008.00"
  [3]=>
  string(8) "60600.00"
  [4]=>
  string(8) "41520.00"
  [5]=>
  string(7) "5880.00"
  [6]=>
  string(7) "6744.00"
}

这会将 trimmed 函数应用于数组中的元素。

答案 1 :(得分:1)

使用array_map。代码如下所示:

$originalArray = json_decode($jsonText, true);

$data = array_map(function($value){
    return str_replace(" ", '', $value);
}, $originalArray);

var_dump($data);

稍后编辑: 看起来问题的要求发生了变化,输入数据也一样。 这也改变了一切。 你可以在这里看到http://php.net/array_map它是如何工作的,它更简单,更清洁。

所以,让数组包含这些数据(让我们只取第一个键值)

// this is the actual data from the array
$a = "20200920202020202020202020202020202020313535266e6273703b3830382e30302020200920202020202020202020202020202020";

// make it readable
$b = hex2bin($a);

// see what is inside
var_dump($b);

var_dump将返回如下内容:

string(54) "                    155&nbsp;808.00                     "

所以,你有&nbsp;,这是6个字符,只显示一个。

在这种情况下我看到的解决方案是使用trim函数从字符串的开头和结尾删除空格,然后使用preg_replace删除所有非数字字符和点。

$b = trim($b);
$b = preg_replace("/([^0-9\.]+)/", '', $b);

结果将是:

string(9) "155808.00"

因此,最终结果将如下所示:

$data = array_map(function($value){
    $value = trim($value);

    return preg_replace("/([^0-9\.]+)/", '', $value);
}, $originalArray);

答案 2 :(得分:0)

你需要迭代

foreach($a2 as $index => $a2str){
    $a2[$index] = str_replace(" ", "", $a2str);
}

答案 3 :(得分:-1)

在删除空格时我个人使用Preg_replace而不是str_replace

试试这个:

preg_replace('/(\s)/gm', '', $a2);

相关问题