Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP、DOMDocument和XPATH时出现字符串长度问题_Php_String_Xpath_Domdocument - Fatal编程技术网

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

使用PHP、DOMDocument和XPATH时出现字符串长度问题,php,string,xpath,domdocument,Php,String,Xpath,Domdocument,我使用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->loadH

我使用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);
我获取了我需要的数据,它工作得很好,但是现在我需要比较两个字符串。原件直接取自
  • -标签。解析是将四个或五个
    连接在一起

    $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>";
    
    我开始胡闹,替换所有空格,尝试使用不同编码的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>";
    
    有点奇怪。str_replace甚至不会删除最后的空白


    非常感谢您的帮助。

    我可以从
    echo“
    语句换行这一事实看出您正在浏览器中查看此内容。其他html元素也将由浏览器呈现。如果它们出现在字符串的末尾,则它们可能对显示的文本没有影响,但会影响长度。见鬼,它们甚至可以出现在字符串的中间而不影响格式,如果标签恰好是不会改变字符串输出外观的类型。 另一种可能是您有其他空白字符或不可打印字符

    若要确认,请在浏览器中查看文档的源,而不是查看渲染的输出。如果此时看不到任何内容,请尝试下载文档并在一个好的文本编辑器(如记事本++)中查看,在该编辑器中可以调整显示的字符,以包括通常未打印的字符


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

    我可以从
    echo”
    语句生成新行的事实看出您正在浏览器中查看此问题。其他html元素也将由浏览器呈现。如果它们出现在字符串的末尾,则它们可能对显示的文本没有影响,但会影响长度。见鬼,它们甚至可以出现在字符串的中间而不影响格式,如果标签恰好是不会改变字符串输出外观的类型。 另一种可能是您有其他空白字符或不可打印字符

    若要确认,请在浏览器中查看文档的源,而不是查看渲染的输出。如果此时看不到任何内容,请尝试下载文档并在一个好的文本编辑器(如记事本++)中查看,在该编辑器中可以调整显示的字符,以包括通常未打印的字符


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

    我是,您很可能是正确的。您是否知道足够的XPATH来提供查询('//li[@class=“i”]/');在纯文本中解析它,而不保存标记信息?我是,你很可能是对的。您是否知道足够的XPATH来提供查询('//li[@class=“i”]/');在纯文本中解析它,而不保存标记信息?
    $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