2012-04-23 61 views
0

我是Regualr表達式的新手,我只是沒有得到它的掛鉤。如何使用正則表達式的靜態HTML代碼(PHP)

我已經使用CURL和PHP從給定的網頁抓取了html內容。這個網頁從來沒有改變其結構。頁面上的結果取決於搜索功能,但html標籤始終是相同的。我需要根據輸入的搜索字詞從頁面中獲取結果數據。

我需要的數據是:

<h1 class="location_only">(555) 555-5555 is a Landline</h1>

所以我要抓住什麼是插圖中

<h1 class="location_only"></h1>

如果我有$data,這是生成的HTML,如何我把它放到正則表達式中並回顯我發現的數據爲$result

+0

你能否提供你正在試圖從提取的HTML代碼的實例或片段? – 2012-04-23 16:10:57

+2

回答了數百萬次,其中...將html解析爲xml並從中取出...不要使用正則表達式 – scibuff 2012-04-23 16:14:31

+0

[RegEx match open tags but XHTML self-contained tags]可能的重複(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-標籤) – gpojd 2012-04-23 16:23:25

回答

0

你不能可靠地從HTML中用正則表達式提取信息。但是,您可以使用HTML解析器,如DOMDocument::LoadHTML。這將從一個字符串中獲取HTML,然後您可以使用諸如getElementByIdgetElementByTagName之類的函數來查找您的值。還有其他的HTML解析器。

2

Please do not use regular expressions to parse HTML.

請使用HTML解析器,如Simple HTML DOM Parser。您的問題可能看起來局部化,但事實並非如此。即使是這樣,對於這種類型的問題,在以後的日期範圍內會有很大的吸引力,即使您可以使用正則表達式來處理這些問題,也會帶來很大的麻煩。

+0

嗯,我有簡單的HTML DOM分析器,但我真的不知道如何在這個應用程序中使用它。如果我這樣做,我會的。你能指導我參加一個教程,還是應該開始一個新的問題? – user1351759 2012-04-23 16:25:53

0

這兩個答案告訴你不要正則表達式,而是使用一個DOM解析器是正確的,但是,如果頁面結構沒有改變,一個快速的&骯髒的正則表達式會做的伎倆就好了,因爲你有絕對好的開始和結束點供參考。

1

您可以選擇與此搜索模式標籤之間的文本:

<span id="result1">(.*?)</span> 

捕獲組申報表「(555)555-5555爲固定電話」,如果你的代碼是:<span id="result1">(555) 555-5555 is a Landline</span>

有關更多信息,請參閱preg_match()如何回顯結果。

也像其他人所建議的那樣查看HTML DOM解析器。也許我不應該有任何答案...

0

您被提醒足以不使用正則表達式來解析HTML。因此,這裏是一個DOM解析器基於代碼提取你的價值:

$html = <<< EOF 
<html> 
<head> 
<title>Some Title</title> 
</head> 
<body> 
<H1 class="location_only">(555) 555-5555 is a Landline</H1> 
</body> 
</html> 
EOF; 
$doc = new DOMDocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($html); // loads your html 
$xpath = new DOMXPath($doc); 
$value = $xpath->evaluate("string(//h1[@class='location_only']/text())"); 
echo "Your H1 Value=[$value]\n"; // prints text between <h1> and </h1> 

OUTPUT:

Your H1 Value=[(555) 555-5555 is a Landline]