2011-01-10 60 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(虽然使用非贪婪的匹配会有所帮助),但是网站本身的设计阻止了你解析出你想要的东西。