2011-05-10 97 views
4

即時通訊使用PHP和我需要刮一些信息從一些捲曲響應到一個網站。我模擬瀏覽器的ajax請求和瀏覽器的正常(全部)頁面請求,但是ajax響應與本節html中的整個頁面請求略有不同。PHP正則表達式可選地匹配整個詞

Ajax響應是: <div id="accountProfile"><h2>THIS IS THE BIT I WANT</h2><dl id="accountProfileData">

但是正常的反應是: <div id="accountProfile"><html xmlns="http://www.w3.org/1999/xhtml"><h2>THIS IS THE BIT I WANT</h2><dl id="accountProfileData">

即Ajax響應缺少標籤:<html xmlns="http://www.w3.org/1999/xhtml">。我需要獲取h2標籤之間的位。顯然我不能只是刮<h2>THIS IS THE BIT I WANT</h2><dl id="accountProfileData">的頁面,因爲這些標籤可能發生在其他地方,並不包含我想要的信息。

我可以單獨匹配任何一種模式,但是我想要在一個正則表達式中執行這兩種模式。這裏是我的匹配Ajax響應的解決方案:

<?php 
$pattern = '/\<div id="accountProfile"\>\<h2\>(.+?)\<\/h2\>\<dl id="accountProfileData"\>/'; 
preg_match($pattern, $haystack, $matches); 
print_r($matches); 
?> 

有人可以告訴我如何,我應該改變有選擇地匹配<html xmlns="http://www.w3.org/1999/xhtml">標籤藏漢模式?如果它有助於簡化乾草堆的簡潔的目的,那很好。

+0

正常響應被打破 - 一個'html'元素具有文檔中沒有位置。我不完全確定你的問題是什麼?你有沒有考慮過使用DOM解析器來解析HTML?請參見[解析HTML的最佳方法](http://stackoverflow.com/questions/3577641/3577662#3577662) – 2011-05-10 07:38:15

+0

它可能是壞的,但它在那裏都一樣。我沒有寫我刮的網站。好的,我更新了需求 – mulllhausen 2011-05-10 07:39:28

回答

2

我沒有測試它,但你可以試試這個:

$pattern = '/\<div id="accountProfile"\>(\<html xmlns=\"http://www.w3.org/1999/xhtml\"\>){0,1}\<h2\>(.+?)\<\/h2\>\<dl id="accountProfileData"\>/'; 
+0

,它可以工作 - 只要你在'xmlns = \「http:// www.w3.org/1999/xhtml' :)中逃避一切,你也可以簡化'{0,1}' ''' – mulllhausen 2011-05-10 07:58:35

+0

是的 - 我很高興它的工作原理 – 2011-05-10 08:01:03

+0

我想知道是否可以在'html xmlns = ...'標籤中沒有括號的情況下編寫模式?它沒什麼大不了的,但是php的preg_match創建了一個新的數組元素用於匹配括號中的模式的任何內容當然,我可以使用最後的'$ matches'數組元素,但是我好奇它是否可能避免匹配這種不需要的'html xmlns = ...'標記模式 – mulllhausen 2011-05-12 04:08:57