使用PHP去掉多余的空间.我的代码出了什么问题


Getting rid off extra spaces using PHP. What is wrong with my code?

我正在尝试使用以下PHP代码从网站检索一些信息:

$doc = new domDocument();
$html = file_get_contents('https://www.ibar.az/en/');
libxml_use_internal_errors(true);
$doc->loadHTML($html);
libxml_use_internal_errors(false);
$ExchangePart = $doc->getElementsByTagName('li');
$USD=$ExchangePart->Item(91)->nodeValue;
$USD=htmlentities($USD);
$USD=str_replace("&nbsp","", $USD);
$TrimedUSD=trim($USD);
$USDArray=str_split($TrimedUSD);
$TotalSymbols=count($USDArray);
$k=0;
for ($i=0; $i<$TotalSymbols; $i++) {
    //var_dump($USDArray[$i]);
    if ($USDArray[$i]==" " or $USDArray[$i]==PHP_EOL) {
        $k=$k+1;
        //echo ($k."<br>");
            if ($k>1) {
                unset($USDArray[$i]);
            }
    } else {$k=0;}
}
var_dump($USDArray);

我使用for循环来消除字符串中多余的空格。我故意不想使用正则表达式。

不幸的是,该代码无法清除所有EXTRA空格。var_dump:的结果

array(34) { [0]=> string(1) "U" [1]=> string(1) "S" [2]=> string(1) "D" [3]=> string(1) " " [4]=> string(1) " " [5]=> string(1) " " [37]=> string(1) "1" [38]=> string(1) "." [39]=> string(1) "5" [40]=> string(1) "0" [41]=> string(1) "9" [42]=> string(1) "4" [43]=> string(1) " " [44]=> string(1) " " [45]=> string(1) " " [77]=> string(1) "1" [78]=> string(1) "." [79]=> string(1) "4" [80]=> string(1) "6" [81]=> string(1) "4" [82]=> string(1) "1" [83]=> string(1) " " [84]=> string(1) " " [85]=> string(1) " " [117]=> string(1) "1" [118]=> string(1) "." [119]=> string(1) "5" [120]=> string(1) "5" [121]=> string(1) "1" [122]=> string(1) "7" [123]=> string(1) " " [124]=> string(1) " " [125]=> string(1) " " [157]=> string(1) ";" }

它在单词之间留下3个空格(数组元素4&,5),尽管我想只保留一个空格。

有人能指出我做错了什么吗。Grasias!:)

更新:

当使用Chrome查看var_dump的结果时,我注意到了什么来源:

array(34) { [0]=> string(1) "U" [1]=> string(1) "S" [2]=> string(1) "D" [3]=> string(1) " " [4]=> string(1) "" [5]=> string(1) " " .... ....

参见项目[4]和[5]。我觉得这些不是空间。。。有什么建议吗?

更新2

我使用ORD函数转换并打印每个符号的ASCII代码:for ($i=0; $i<$TotalSymbols; $i++) { print_r(ord($USDArray[$i])."<br>"); }

并发现一些空白只是假装空白:)部分输出:

85-U83-S68-D13<-回车10<-换行符32-普通空间32-普通空间。。。。。。。。。带有代码10&13人有罪!

我认为您的问题在于unset,它会使数组跳过元素。你可以试试这样的东西:

$k=0;
$dummy_array = $USDArray;
foreach ($dummy_array as $key => $value) {
    //var_dump($USDArray[$i]);
    if ( " " == $value || $value == PHP_EOL || '' == $value) {
        $k=$k+1;
        //echo ($k."<br>");
            if ($k>1) {
                unset($USDArray[$key]);
            }
    } else {$k=0;}
}
if ($USDArray[$i]==" " && $USDArray[$i+1]==" "){ 
    $k = $i;
    While($USDArray[$k]==" ") {
        Unset($USDArray[$k]);
        $k++;
    }
    $i = $k+1;
}

未经测试,写在我的手机上。所以可能会有一些错误。

使用以下代码:-

$USDArray = ['0' => 'A', '1' => 'B', '2' => ' ', '3' => ' ','4' => ' ', '5' => 'C','6' => ' ', '7' => ' '];
$USDArray = array_map('trim', $USDArray); // remove white space from array elements
for($i=0;$i<=count($USDArray);$i++){
    if (empty($USDArray[$i]) && empty($USDArray[$i+1])){        
          unset($USDArray[$i+1]);   
    }
}
echo '<pre>'; print_r($USDArray); 

$USDArray = ['0' => 'A', '1' => 'B', '2' => ' ', '3' => ' ','4' => ' ', '5' => 'C','6' => ' ', '7' => ' '];
$USDArray = array_map('trim', $USDArray); // remove white space from array elements
foreach($USDArray as $k=>$v){
    if (empty($USDArray[$k]) && empty($USDArray[$k+1])){        
           unset($USDArray[$k+1]);   
    }
}
echo '<pre>'; print_r($USDArray); 

输出:-

Array
(
    [0] => A
    [1] => B
    [2] => 
    [5] => C
    [6] => 
)

注意:-use array_values()返回数组中的所有值,并对数组进行数字索引。

echo '<pre>'; print_r(array_values($USDArray)); 

输出:-

Array
(
    [0] => A
    [1] => B
    [2] => 
    [3] => C
    [4] => 
)

唯一合理的做法是使用regex来完成。

$count = null;
$returnValue = preg_replace('/(''s{2,})/', ' ', 'USD  11    99', -1, $count);

result: 'USD 11 99'