2017-06-02 111 views
0

我用腳本打了一個路障,我必須檢查某個網站上的可用性。我需要html標籤中的文本,我不確定如何處理它。使用PHP和preg_match捕獲HTML標記內的文本

我的代碼,我已經測試了這個結束:

<?php 
ini_set("allow_url_fopen", 1); 
$homepage2 = file_get_contents('https://www.someurlwithavailability.com'); 
//URL has the following HTML tag: <div id="Availability"> 
          Availability: Special Offer, ships within 10 - 15 business days       </div>" 
preg_match("/<div id="Availability">(.*?)</div>/si", $homepage2, $avail); 
print_r($avail); 
echo '<br>', '~Availability is~', '<br>', $avail, '<br>'; 
$stringavail=implode(" ",$avail); 
echo $stringavail; 
?> 

我得到這取決於我的preg_match(***,$ homepage2,$無濟於事)後,把各種錯誤;我不確定我需要輸入什麼語法來檢索文本。

上面我的代碼給了我這樣的:

解析錯誤:語法錯誤,意想不到的 '可用性' 上線(T_STRING)在/u/o/placeiamrunningthecodefrom.php 6

被請求的URL來返回一個非常大的完整的HTML頁面。這個HTML標籤是唯一的,不會重複。

任何人都能幫助我?

+0

是否有任何選擇使用PHP DOM?如果元素id/class不是動態的,我更喜歡使用php dom來解析html字符串 –

+0

我閱讀了關於DOM的內容,但我很困惑它將如何修改html,我必須使用它。所以我試圖遠離它。 – Chris

+0

通過這些答案的組合,我現在有一個解決方案。謝謝! – Chris

回答

0

的問題是,你有你的雙引號字符串內的雙引號,並沒有逃過他們:

preg_match("/<div id="Availability">(.*?)</div>/si", $homepage2, $avail); 
        ^  ^

如果你使用一個體面的IDE它會提醒你這是你打字。

只需將分隔符改爲單引號即可。

此外,由於您的正則表達式定界符/出現在正則表達式中,因此您需要轉義其出現在正則表達式中的字符,或者使用不在表達式中的分隔符。

preg_match('#<div id="Availability">(.*?)</div>#si', $homepage2, $avail); 

但是,使用正則表達式來解析HTML通常是一個壞主意。您應該使用類似DOMDocument類的DOM解析器庫。

+0

這不是唯一的問題。 /用作分隔符,但也在最後的div標籤中。 – Andreas

+0

好,我已經更新瞭解決這個問題的答案。 – Barmar

+0

我已經嘗試了幾個分隔符的組合,並且我一直在遇到相同的語法問題。我會嘗試用英鎊符號 – Chris

0

雖然這可以正常工作正則表達式。這不被推薦,也不容易。

我建議給DOMDocument::getElementById一個去。它甚至有一個例子右邊的頁面上:

$doc = new DomDocument; 

// We need to validate our document before refering to the id 
$doc->validateOnParse = true; 
$doc->Load('book.xml'); 

echo "The element whose id is 'php-basics' is: " . $doc->getElementById('php-basics')->tagName . "\n"; 

我們獲取內容,而不是標籤名,我們可以使用->textContentdomnode

0

繼承周圍使用該模式單引號試試。 而且,確保你正在逃避特殊的正則表達式字符。 而且,你基本上要求所有的東西到最後的</div>。所以,你需要更具體。

'/<div id="Availability">([^<]*)<\/div>/si'

代替

"/<div id="Availability">(.*?)</div>/si"

當然,這仍然可能是不可靠的,如果有HTML,該<div>

但是,這應該讓你更接近。

另外,嘗試一個在線正則表達式工具。我喜歡這一個。 https://regex101.com/

+0

的建議我認爲我之後的文本之間的空格也可能有問題。我會試試看看會發生什麼。 – Chris

+0

在代碼中更改爲([^ <] *)似乎抓住了標籤之間的整個字符串。讓它像(。*?)留下輸出空白。大概拿起一個白色空間?不知道爲什麼。 – Chris