欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > php >内容正文

php

php表单提取,php – 使用RegEx提取表单字段

发布时间:2025/3/12 php 27 豆豆
生活随笔 收集整理的这篇文章主要介绍了 php表单提取,php – 使用RegEx提取表单字段 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

使用正则表达式解析HTML可能不是最好的方法.

您可以查看DOMDocument::loadHTML,这将允许您使用DOM方法处理HTML文档(例如,如果您知道这些,则使用XPath查询).

您可能还想看一下Zend_Dom和Zend_Dom_Query,顺便说一句,如果您可以在应用程序中使用Zend Framework的某些部分,这是非常好的.

例如,在使用Zend_Test进行功能测试时,它们用于从HTML页面获取数据 – 并且工作得很好;-)

首先看起来似乎更难……但是,考虑到一些HTML页面的混乱,它可能是一个更明智的想法……

在评论和编辑OP之后编辑

这里有几个想法,从“简单”开始,一个输入标签:

>它可以跨越几条线传播

>它可以有很多属性

>只考虑名称和价值是您感兴趣的,您必须处理这两个可能处于任何可能的顺序的事实

>属性可以包含双引号,单引号,甚至不包含其值

> tags / attributes可以是小写的也可以是大写的

>标签并不总是必须关闭

好吧,其中一些点无效 – HTML;但仍然在大多数公共网络浏览器中工作,所以必须考虑到它们……

只有这些点,我不想成为写正则表达式的人^^

但我想可能还有其他一些我没想过的困难.

另一方面,你有DOM和xpath …要获得输入名称=“q”的值(例如this page),这是一个类似这样的问题:

$url = 'http://www.google.fr/search?q=test&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a';

$html = file_get_contents($url);

$dom = new DOMDocument();

if (@$dom->loadHTML($html)) {

// yep, not necessarily valid-html...

$xpath = new DOMXpath($dom);

$nodeList = $xpath->query('//input[@name="q"]');

if ($nodeList->length > 0) {

for ($i=0 ; $ilength ; $i++) {

$node = $nodeList->item($i);

var_dump($node->getAttribute('value'));

}

}

} else {

// too bad...

}

重要的是什么? XPath查询,只有…并且它有什么静态/常量吗?

好吧,我说我想要所有< input>具有等于​​“q”的name属性.

它只是工作:我得到这个结果:

string 'test' (length=4)

string 'test' (length=4)

(我查了一下:页面上有两个输入名称=“q”^^)

我知道页面的结构吗?绝对没有;-)

我只知道我/你/我们想要名为q的输入标签;-)

这就是我们得到的;-)

编辑2:选择和选项有点乐趣:

好吧,只是为了好玩,这是我为选择和选项提出的:

$url = 'http://www.google.fr/language_tools?hl=fr';

$html = file_get_contents($url);

$dom = new DOMDocument();

if (@$dom->loadHTML($html)) {

// yep, not necessarily valid-html...

$xpath = new DOMXpath($dom);

$nodeListSelects = $xpath->query('//select');

if ($nodeListSelects->length > 0) {

for ($i=0 ; $ilength ; $i++) {

$nodeSelect = $nodeListSelects->item($i);

$name = $nodeSelect->getAttribute('name');

$nodeListOptions = $xpath->query('option[@selected="selected"]', $nodeSelect); // We want options that are inside the current select

if ($nodeListOptions->length > 0) {

for ($j=0 ; $jlength ; $j++) {

$nodeOption = $nodeListOptions->item($j);

$value = $nodeOption->getAttribute('value');

var_dump("name='$name' => value='$value'");

}

}

}

}

} else {

// too bad...

}

我得到一个输出:

string 'name='sl' => value='fr'' (length=23)

string 'name='tl' => value='en'' (length=23)

string 'name='sl' => value='en'' (length=23)

string 'name='tl' => value='fr'' (length=23)

string 'name='sl' => value='en'' (length=23)

string 'name='tl' => value='fr'' (length=23)

这是我的预期.

一些解释?

好吧,首先,我获取页面的所有选择标记,并将其名称保存在内存中.

然后,对于每一个,我得到选定的选项标签作为其后代(总是只有一个,顺便说一句).

在这里,我有价值.

比前面的例子复杂一点……但是仍然比正则表达式容易得多,我相信……花了我10分钟,而不是更多……我仍然没有勇气(疯狂?)开始想想某种能够做到这一点的突变正则表达式:-D

哦,作为旁注:我仍然不知道HTML文档的结构是什么样的:我甚至没有看过它的源代码^^

我希望这会有所帮助……

谁知道,也许我会说服你正则表达式在解析HTML时不是一个好主意……也许吧? 😉

还是:玩得开心!

创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的php表单提取,php – 使用RegEx提取表单字段的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。