2012-08-07 37 views
1

我有這樣的HTML提取單個簡單的文字:「你好!世界[PHP]如何從一個長的HTML源

......whatever very long html..... 

<span class="title">hello world!</span> 

......whatever very long html...... 

這是一個很長的HTML,我只想要的內容從這個網站 我得到這個網站由

$result = file_get_contents($url , false, $context); 

許多人使用簡單的HTML DOM解析器,但我認爲在這種情況下,使用正則表達式會更有效。

我應該怎麼做?有什麼建議麼?任何幫助都會非常棒。

在此先感謝!

+0

如果您在構建正則表達式時遇到問題,你總是可以回到簡單的split()函數。 – Waygood 2012-08-07 09:37:24

+0

用正則表達式解析HTML通常被認爲是一個壞主意。可能的相關問題和......如果相關答案不是**技術**,它可以描述_world implosion_,您可能會通過使用RegEx解析HTML來召喚我們:http://stackoverflow.com/a/1732454/1428773 – Whisperity 2012-08-07 09:46:31

回答

2

堅持使用DOM解析器 - 它更好。說了這麼多,你可以使用這樣的正則表達式...

// where the html is stored in `$html` 
preg_match('/<span class="title">(.+?)<\/span>/', $html, $m); 
$whatYouWant = $m[1]; 

preg_match()賣場內的正則表達式括號捕獲的所有元素的數組,這是整個捕獲字符串0個元素。正則表達式在這種情況下非常簡單,幾乎是一個直接的字符串匹配你想要的,並且結束跨度標記的斜槓被轉義。被捕獲的部分僅意味着任何字符(.)一次或多次(+)不貪心(?)。

0

不,我真的不認爲regEx或類似的功能會更有效或更容易。

如果你會使用SimpleHTML DOM,你可以迅速獲得您正在尋找這樣的數據:

//Get your file 
$html = file_get_html('myfile.html'); 
//Use jQuery style selectors 
$spanValue = $html->find('span.title')->plaintext; 

echo($spanValue); 

用的preg_match,你可以這樣做:

preg_match("/<span class=\"title\">([^`]*?)<\/span>/", $data, $matches); 

或此,如果有是類「標題」的多個跨度:

preg_match_all("/<span class=\"title\">([^`]*?)<\/span>/", $data, $matches); 
+0

從個人經驗來看,我發現當html字符串非常長時,正則表達式會更好。 SimpleHTML DOM太慢了,達到了內存限制[在這種情況下]。 – Prasanth 2012-08-07 09:56:28

+0

有時候,是的 - 這絕對是一種選擇。但是,使用正則表達式可能會讓人頭痛 - 如果示例中跨度內有多個跨度,例如?如果HTML格式錯誤怎麼辦? – Marcus 2012-08-07 10:52:12

+0

當我使用這個庫來獲取以某種東西開始的類的鏈接時,我發現它可以像使用'^ ='的jquery一樣完成。現在,當我在庫文件中搜索'^ ='時,發現它確實使用了正則表達式!我很震驚。最終,我使用了正則表達式,因爲我使用庫已經達到了內存限制。現在,聽到你說正則表達式不會比simplehtmldom有效,我覺得你是部分不正確的,因爲圖書館使用正則表達式!我也意識到圖書館的其他部分是好的。但這是另一回事。 – Prasanth 2012-08-07 11:13:10