使用PHP、DOMDocument和XPATH时出现字符串长度问题


String length problems when using PHP, DOMDocument and XPATH

我使用cURL获取数据,并使用DOMDocument和XPATH进行解析。strlen()给出的计数不规则。

一些介绍代码:

curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);     
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->loadHTML($data);
$xpath = new DOMXpath($dom);

我获取了我需要的数据,它工作得很好,但现在我需要比较两个字符串。原件直接取自<li>-标签。解析是将四个或五个<span>连接在一起。

$original = $i[$n]['full'];
$parsed = $i[$n]['value'].$i[$n]['type'].$i[$n]['name'].$i[$n]['extra'];
echo $original."<br>";
echo $parsed."<br><br>";
echo strlen($original)."<br>";
echo strlen($parsed)."<br><br>";

给予:

4 -5 boneless chicken breasts
4-5Boneless chicken breasts
70
27

我开始把所有的空格都替换掉,用不同的编码尝试mb_strlen,把类型转换成字符串,但都无济于事:

$replace = array(' ',',');
$mod_original = str_replace($replace,'',$original);
$mod_parsed = str_replace($replace,'',$parsed);
var_dump($mod_original);
echo "<br>";
var_dump($mod_parsed);
echo "<br><br>";
echo mb_strlen($mod_original,'UTF-8')."<br>";
echo mb_strlen($mod_parsed,'UTF-8')."<br>";

结果:

string(62) "4-5 bonelesschickenbreasts" 
string(25) "4-5Bonelesschickenbreasts" 
62
25

有些事情很奇怪。str_replace甚至不会删除最后的空白。

感谢您的帮助。

我可以从echo "<br>"语句生成新行这一事实看出,您正在浏览器中查看这一点。其他html元素也将由浏览器呈现。如果它们出现在字符串的末尾,那么它们可能对显示的文本没有影响,但会影响长度。嘿,如果标签的类型不会改变字符串输出的外观,那么它们甚至可以出现在字符串的中间,而不会影响格式。

另一种可能是您有其他空白字符或不可打印字符。

要确认哪一个,请在浏览器中查看文档的源,而不是查看渲染的输出。如果你当时没有看到任何东西,请尝试下载文档,并在一个好的文本编辑器(如Notepad++)中查看它,在那里你可以调整显示的字符,以包括通常不会打印的字符。

一旦您确定是哪些字符/标记导致了问题,那么您就可以创建一个str_replace()preg_replace()调用来适当地处理它。