2013-08-01 62 views
1

我使用我用DOMDocument和XPATH解析的cURL讀取數據。 strlen()給出了不規則的計數。使用PHP,DOMDocument和XPATH時的字符串長度問題

一些介紹代碼:

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> -tag中直接獲取的。解析是將四個或五個<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甚至不會刪除最後一個空格。

任何幫助表示讚賞。

回答

1

我可以告訴你,你正在瀏覽器中看到這個事實,echo "<br>"聲明換了一條新線。其他html元素也會被瀏覽器渲染。如果它們出現在字符串的末尾,那麼它們可能對顯示的文本沒有影響,但會影響長度。哎呀,如果這些標籤碰巧是不會改變字符串輸出的外觀的,那麼它們甚至可能出現在字符串的中間而不會影響格式。

另一種可能是你有其他的空白字符或不可打印的字符。

要確認哪個,請在瀏覽器中查看文檔的來源,而不是查看呈現的輸出。如果您在此時沒有看到任何內容,請嘗試下載文檔並在良好的文本編輯器(如Notepad ++)中查看該文檔,您可以在其中調整顯示的字符以包括通常不打印的字符。

一旦你找出哪些字符/標籤引起問題,那麼你可以創建一個str_replace()preg_replace()調用來適當地處理它。

+0

我是,你很可能是正確的。你知道XPATH有足夠的查詢嗎('// li [@ class =「i」] /');以純文本解析它,而不保存標記信息? – Mattis