2011-01-10 110 views
1

我想從網站獲得<form>。但在這種情況下的表單部分之間,還有其他的html代碼。如何刪除它們?我的意思是如何使用PHP只是定期和部分從網站?php正則表達式問題

$str = file_get_contents('http://bingphp.codeplex.com'); 
preg_match_all('~<form.+</form>~iUs', $str, $match); 
var_dump($match); 
+0

你是什麼意思「刪除它們」?你想要`

`,並且你已經掌握了所有元素。你的預期產出是多少? – Kobi 2011-01-10 10:46:56

回答

2

您不應該使用正則表達式來提取HTML內容。使用DOM parser

E.g.

$doc = new DOMDocument(); 
$doc->loadHTMLFile("http://bingphp.codeplex.com"); 

$forms = $doc->getElementsByTagName('form'); 

更新:如果你想刪除的形式(不知道你的意思是):

for($i = $forms.length;$i--;) { 
    $node = $forms->item($i); 
    $node->parentNode->removeChild($node); 
} 

更新2:

我只注意到他們有一個包含全身內容的格式。所以這樣或那樣,你會得到整個頁面。

0

我能想到的最好的方法是使用PHP的簡單HTML DOM庫來從HTML頁面使用DOM查詢獲取表單。

這比使用像simplexml或domdocument這樣的內置xml解析器更方便一些。

您可以在這裏找到the library

1

正則表達式的問題在於貪婪。對於這種情況,建議使用.+?

但是@Felix說了些什麼。雖然正則表達式對於HTML 提取可行,但您經常會查找特定的內容,因此應該對其進行解析。它也更簡單,如果你使用QueryPath

$str = file_get_contents('http://bingphp.codeplex.com'); 
print qp($str)->find("form")->html(); 
+1

`。+?`在這種情況下會失敗 - 它們在JavaScript字符串*中嵌套了``標籤*!哦,不 - 爲什麼!? – Kobi 2011-01-10 10:43:43

0

通常情況下,你應該使用DOM來解析HTML,但在這種情況下,網站是很遠不是標準的HTML,與一些代碼正在地方通過修改JavaScript的。因此它不能被加載到DOM對象中。這可能是故意的,這是一種混淆代碼的方式。

無論如何,它不是你的RE(雖然使用非貪婪的匹配會有所幫助),但是網站本身的設計阻止了你解析出你想要的東西。