1

私はこの分野の専門家ではないので、私を助けて、もしあれば私の無知を惜しまないでください。ページを丸くしようとしていますが、非表示<input>フィールドの値を取得したいと思います。私は正規表現に精通していません。私のコードは以下の通りです:

       $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">

この入力フィールドの値を取得したいと思います。

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=\"([^\">]+?)\"。違いは.、よりもはるかに多くのエンティティに一致することです[^">]。これは、常にタグのクローズまたは引用符のクローズで終了します。

あなたの場合の問題は、複数行の一致修飾子がないことかもしれません。試してみてくださいpreg_match('/<input id="signuptoken" type="hidden" value="(.*?)"/s', $page, $m);

それ以外は、次にDOMを使用します。

また、ページのHTMLをファイルに保存し、毎回ページを呼び出すのではなく、ローカルファイルで正規表現をテストします。

于 2012-12-03T19:34:24.553 に答える