我不是这个领域的专家,所以请帮助我,不管我的无知,如果有的话。
我正在尝试浏览页面并希望获得隐藏的<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">
我想获取此输入字段的值。
答案 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
标记中type
和input
的顺序就会破坏刮刀。如果你确定HTML永远不会改变,那应该不是问题,但要注意在某些情况下DOM解析器可能更有用。
答案 2 :(得分:0)
不要使用像value=\"(.+?)\"
这样的东西,在一些格式错误的HTML中,你可能会遇到很多麻烦。使用更像value=\"([^\">]+?)\"
的限制。区别在于.
匹配的实体多于[^">]
,而preg_match('/<input id="signuptoken" type="hidden" value="(.*?)"/s', $page, $m);
总是在标签关闭或报价关闭时结束。
您的情况可能是缺少多行匹配修饰符 s ,请尝试{{1}}。
除此之外,我会说,使用DOM。
此外,将页面HTML保存到文件中并在本地文件上测试您的RegEx,而不是每次都调用页面。