0

私は抽出したい隠された価値を持つフォームを(自分のブログ/ cmsインストールで少し遊んでみたい)持っています。問題は、そのページに 2 つのフォームがあり、それぞれに値を持つ非表示フィールドがあることです。各フォーム フィールド名は同じで、非表示の値のみが異なります。このようなもの:

<input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>

どちらもhtmlソースでは同じに見えます。だから、自分を助けるために、このページでphpファイルを開き、編集して、必要なフィールドの前にランダムな単語をいくつか追加しました。したがって、1 つのフィールド (不要なフィールド) は上記のコードのようになりますが、必要なフィールドは次のようになります。

mywordshere <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>

ページの HTML ソースが php 変数 (libcurl で取得) にある場合、必要なフィールドから値を抽出するにはどうすればよいですか(コードの前に mywordshere を使用)。

4

4 に答える 4

2

DOMDocumentを使用した例

<?php

$html = <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">
<html>
<body>
  <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere">
</body>
</html>
HTML;

$doc = new DOMDocument();
$doc->validateOnParse = true;
$doc->loadHTML( $html );

$node = $doc->getElementById( '_hiddenname' );
echo $node->getAttribute( 'value' );

?>

注:これが機能するには、HTML文字列にDOCTYPEが定義されている必要があります。

于 2009-09-08T17:39:56.670 に答える
1

同じ名前で同じIDを持つ2つの入力フィールドがあるという事実は、本当の問題です。HTML要素の属性は、特定のページで一意であると想定されており、そうである場合は、 DOMパーサーidを使用してこれを簡単に行うことができます。例:

$dom = new domDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$inputs = $dom->getElementsByTagName('input');
foreach ($inputs as $i)
{
    if ($i->getAttribute('id') == 'targetId') {
        //do some stuff
    }
} 

そのアプローチをとることができず、識別可能な文字列で入力をマークしたので、文字列関数の組み合わせを使用します。

$str = 'mywordshere <input type="hidden" id="_hiddenname" name="_hiddenname" value="valuehere"/>';
$pos = strpos($str,'mywordshere');
if ($pos !== false) {
    $valuePos = strpos($str,'value=',$pos);
    if ($valuePos !== false) {
        //get text starting from the 'value=' portion of the string
        $str = substr($str,$valuePos);
        $arr = explode('"',$str);
        //value will be in $arr[1]
        echo $arr[1];
    }
}

ただし、要素IDを作り直し、DOMアプローチを使用することを強くお勧めします。

于 2009-09-08T17:42:19.177 に答える
1

値は、使用している方法に応じて$_GET["_hiddenname"]またはで使用できます。$_POST["_hiddenname"]どちらを取得するかは、送信を行っているフォームによって異なります。

同じフォームに同じ名前のフィールドが 2 つある場合、より大きな問題が発生します。

于 2009-09-08T17:17:44.637 に答える
1

おそらく、2 つのフォームは異なる名前を持っていますね。したがって、スクレイピングしたテキストを DOM 対応のもので解析すると、親フォームで検索して入力フィールドを選択できるはずです。

于 2009-09-08T17:18:19.240 に答える