1

I am not a expert in this field so please help me out and spare my ignorance if any. I am trying to curl through a page and want to get value of the hidden <input> field. I am not familiar with regexp. my code is as below:

       $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);
}

the form field is as below:

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

I want to get the value out for this input field.

4

3 回答 3

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');
于 2012-12-03T14:07:50.870 回答
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和的顺序就会破坏刮板。如果您确定 HTML 永远不会更改,那应该不是问题,但请注意 DOM 解析器在某些情况下可能更有用。typeinput

于 2012-12-03T09:15:46.100 回答
0

不要使用类似的东西value=\"(.+?)\",在一些格式错误的 HTML 中你可能会遇到很多麻烦。使用更具限制性的东西,例如value=\"([^\">]+?)\". 不同之处在于.匹配更多的实体,而不是[^">],它总是以标签关闭或引用关闭结束。

您的问题可能是缺少多行匹配修饰符s, try preg_match('/<input id="signuptoken" type="hidden" value="(.*?)"/s', $page, $m);

除此之外,我将支持使用 DOM。

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

于 2012-12-03T19:34:24.553 回答