我正在尝试使用以下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(" ","", $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'