如何使用preg_match()从表单获取输入字段值

时间:2012-12-03 09:09:23

标签: php regex curl preg-match

我不是这个领域的专家,所以请帮助我,不管我的无知,如果有的话。 我正在尝试浏览页面并希望获得隐藏的<input>字段的值。我对regexp不熟悉。我的代码如下:

       $page = curl_exec($ch);
}
curl_close($ch);

function parse_form_fields($page, $username, $password){
    preg_match("/<input id=\"signuptoken\" type=\"hidden\" value=\"(.+?)\" name=\"signuptoken\"/", $page, $m);

    $captchatoken = $m[1];

    $parameters[] = "newaccounttoken=" . urlencode($captchatoken);
}

表单字段如下:

<input id="signuptoken" type="hidden" value="03AHJ_Vuv2ts6ev2LltAkZB91vjD6k-BsW3286bTC9QZYZLSHQUMNDQJFUaNmAQMAYb9FDhIkOFzAisafasfsTZuv_pl5KvkYNfsGUPcOAEX5YPlMaMOi7MZJq4ky0v_GyM60SmMgjPrtfZSJYE0hqw--GsfsafasmER0Sksr6OAvnLnBVAMsKcCi7uM" name="signuptoken">

我想获取此输入字段的值。

3 个答案:

答案 0 :(得分:5)

最好使用DOMDocument。例如:

$html = '<input id="signuptoken" type="hidden" value="03AHJ_Vuv2ts6ev2LltAkZB91vjD6k-BsW3286bTC9QZYZLSHQUMNDQJFUaNmAQMAYb9FDhIkOFzAisafasfsTZuv_pl5KvkYNfsGUPcOAEX5YPlMaMOi7MZJq4ky0v_GyM60SmMgjPrtfZSJYE0hqw--GsfsafasmER0Sksr6OAvnLnBVAMsKcCi7uM" name="signuptoken">';
$dom = new DomDocument();
$dom->loadHTML($html);

$signuptoken = $dom->getElementById("signuptoken");
echo $signuptoken->getAttribute('value');

答案 1 :(得分:2)

这应该可以帮助您找到值:

<?php
$input  = '<input id="signuptoken" type="hidden" value="03AHJ_Vuv2ts6ev2LltAkZB91vjD6k-BsW3286bTC9QZYZLSHQUMNDQJFUaNmAQMAYb9FDhIkOFzAisafasfsTZuv_pl5KvkYNfsGUPcOAEX5YPlMaMOi7MZJq4ky0v_GyM60SmMgjPrtfZSJYE0hqw--GsfsafasmER0Sksr6OAvnLnBVAMsKcCi7uM" name="signuptoken">';

$result = preg_match('/<input id="signuptoken" type="hidden" value="(.*?)"/', $input, $matches);
if(!$result){
    // Could not find input
} else {
    // Input value found
    echo 'Value: '.$matches[1];
}

使用正则表达式解析HTML并不具有弹性,因为只需更改示例id标记中typeinput的顺序就会破坏刮刀。如果你确定HTML永远不会改变,那应该不是问题,但要注意在某些情况下DOM解析器可能更有用。

答案 2 :(得分:0)

不要使用像value=\"(.+?)\"这样的东西,在一些格式错误的HTML中,你可能会遇到很多麻烦。使用更像value=\"([^\">]+?)\"的限制。区别在于.匹配的实体多于[^">],而preg_match('/<input id="signuptoken" type="hidden" value="(.*?)"/s', $page, $m);总是在标签关闭或报价关闭时结束。

您的情况可能是缺少多行匹配修饰符 s ,请尝试{{1}}。

除此之外,我会说,使用DOM。

此外,将页面HTML保存到文件中并在本地文件上测试您的RegEx,而不是每次都调用页面。