我想从网站获得<form
>。但在这种情况下的表单部分之间,还有其他的html代码。如何删除它们?我的意思是如何使用PHP只是定期和部分从网站?php正则表达式问题
$str = file_get_contents('http://bingphp.codeplex.com');
preg_match_all('~<form.+</form>~iUs', $str, $match);
var_dump($match);
我想从网站获得<form
>。但在这种情况下的表单部分之间,还有其他的html代码。如何删除它们?我的意思是如何使用PHP只是定期和部分从网站?php正则表达式问题
$str = file_get_contents('http://bingphp.codeplex.com');
preg_match_all('~<form.+</form>~iUs', $str, $match);
var_dump($match);
您不应该使用正则表达式来提取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:
我只注意到他们有一个包含全身内容的格式。所以这样或那样,你会得到整个页面。
我能想到的最好的方法是使用PHP的简单HTML DOM库来从HTML页面使用DOM查询获取表单。
这比使用像simplexml或domdocument这样的内置xml解析器更方便一些。
您可以在这里找到the library。
正则表达式的问题在于贪婪。对于这种情况,建议使用.+?
。
但是@Felix说了些什么。虽然正则表达式对于HTML 提取可行,但您经常会查找特定的内容,因此应该对其进行解析。它也更简单,如果你使用QueryPath:
$str = file_get_contents('http://bingphp.codeplex.com');
print qp($str)->find("form")->html();
`。+?`在这种情况下会失败 - 它们在JavaScript字符串*中嵌套了`
通常情况下,你应该使用DOM来解析HTML,但在这种情况下,网站是很远不是标准的HTML,与一些代码正在地方通过修改JavaScript的。因此它不能被加载到DOM对象中。这可能是故意的,这是一种混淆代码的方式。
无论如何,它不是你的RE(虽然使用非贪婪的匹配会有所帮助),但是网站本身的设计阻止了你解析出你想要的东西。
你是什么意思“删除它们”?你想要`