我正在寻找一种方法来获取给定特定URL和表单名称的页面中的所有表单输入和相应值.
function GetForm($url,$name)
{
    return array
    (
        'field_name_1' => 'value_1','field_name_2' => 'value_2','select_field_name' => array('option_1','option_2','option_3'),);
}

GetForm('http://www.google.com/','f');

有人能为我提供必要的正则表达式吗?

编辑:我理解查询DOM将更加可靠,但我正在寻找的是一个网站无关的解决方案,允许我获取给定表单的所有字段.在不知道文档节点的情况下,我不相信这是可能的,我错了吗?

我不需要防弹解决方案,只需要在标准网页上工作,对于FORM标签,我提出了以下RegEx;

'~<form.*?name=[\'"]?' . $name . '[\'"]?.*?>(.+?)</form>~is'

我相信对输入字段做类似的事情并不困难,我发现最具挑战性的是select和option字段的RegEx.

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

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

您可能还想看一下Zend_DomZend_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 ; $i<$nodeList->length ; $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 ; $i<$nodeListSelects->length ; $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 ; $j<$nodeListOptions->length ; $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时不是一个好主意……也许吧?

总结

以上是DEVMAX为你收集整理的php – 使用RegEx提取表单字段全部内容。

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

php – 使用RegEx提取表单字段的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  3. iOS 10 Safari问题在DOM中不再包含元素

    使用此链接,您可以重现该错误.https://jsfiddle.net/pw7e2j3q/如果您点击元素并从dom中删除它,然后单击链接测试.你应该看到旧的元素弹出选择.是否有一些黑客来解决这个问题?解决方法我能够重现这个问题.问题是,每当您尝试删除其更改事件上的选择框时,iOS10都无法正确解除对选择框的绑定.要解决此问题,您需要将代码更改事件代码放在具有一些超时

  4. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  5. .dylib在Debug中链接,在XCode中找不到适用于iPhone的版本

    所以我已经将libxml2.2.dylib库包含在我的iPhoneXCode项目中,以创建一些Xml和XPath解析实用程序.当我编译并运行在模拟器和设备的调试模式时,我没有问题,但是,当我切换到发布模式我得到…

  6. ios – Cordova 3.7在每个本机通话中复制iframe

    由于我已升级到Cordova3.7,每个本地调用都将一个新的iframe附加到DOM,如下所示.为了排除我现有的代码影响cordova的可能性,我尝试使用cordovaCLI创建一个新的代码,添加控制台插件,并在设备控制台中的setInterval循环中调用console.log().因此,我在DOM中收到了大量的iframe.我在iPad3,iOS7上尝试过使用xCode6构建应用程序.有没有人遇到这个问题?

  7. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  8. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  9. swift的正则表达式(NSRegularExpression)

    init(_pattern:String){varerror:NSError?

  10. swift 正则表达式运用实例选自《swifter 100个swift开发必备tip 》

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部