【问题标题】:GetElementById alternativeGetElementById 替代方案
【发布时间】:2013-11-22 13:54:50
【问题描述】:

我正在尝试使用 curl 编写一个简单的脚本,但问题是我需要收集在每个新的 POST 请求 (onLoad()) 上生成的特殊密钥。通过创建一个新的 DOM 元素并使用 DOM 中的 GetElementById 函数获取值,可以很容易地传递问题,但是在这种情况下,在我想要返回值的特定标记中没有声明“id”。只有一个名字。

例子:

<input name="trans_id" value="Lk+Vz957skV845b7x2DX7iyR1FI=" type="hidden">

下面是我今天做的一个伪代码(最后一段是我需要帮助的地方):

<?php
    // Author       :   me
    // Date         :   10.11.2013.
?>

<?php
    // Declaring variables :)
    $data_string = '';
    $url = 'http://www.website.com';
    $uagent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6';

    // Declaring variables for e-pay
    $url2 = 'http:/website2.com';

    ...

    $exChar = '|';
    $exStr = '';

    $exStr = Explode($exChar, $_POST['ccep']); 

    $data = array (
        "email" => '',
            ...
        "submitFromInputForm" => 'Next',
    );

    foreach($data as $key=>$value) { $data_string .= $key.'='.$value.'&'; }
    rtrim($data_string, '&');   

    $ch = curl_init ();


    curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt ($ch, CURLOPT_HEADER, 0);
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_USERAGENT, $uagent);
    curl_setopt ($ch, CURLOPT_POST, count($data));
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $data_string);



    $result = curl_exec ($ch);
    print($result);

    // ====================================================================
    // Need help with this function
    $check = strpos($result, 'Confirmation');
        if ($check == True) {
            $doc = new DOMDocument();
            @$doc->loadHTML($result);
            $id = $doc->getElementsByName('trans_id');
            echo 'Value:' . $id;
        }
    // ====================================================================    

    curl_close($ch);
?>

但老实说,我无法从该函数中获得结果,因为它不存在。谷歌搜索只能帮助我删除结果以使用 getElementsByTagName 在阅读 PHP 官方的文档后,并不能解决我的问题。

最后的说明:我不想包含任何 Javascripting,只包含纯 PHP。

提前谢谢你,
问候。

【问题讨论】:

    标签: javascript php html dom curl


    【解决方案1】:

    您可以使用DOMXPath 通过 xpath 访问特定属性。

    $domx = new DOMXPath($doc);
    $trans_id = $domx->evaluate("//input[contains(@name, 'trans_id')]");
    

    如果需要,最终循环遍历对象

    foreach ($trans_id as $id) {
        echo "Value:" . $id->nodeValue;
    }
    

    再想一想,您需要value 属性,因此您需要使用getAttribute() 来检索它。我刚刚使用以下代码进行了测试,它按预期工作:

    <?php
    $result = '<input name="trans_id" value="Lk+Vz957skV845b7x2DX7iyR1FI=" type="hidden">';
    $doc = new DOMDocument();
    @$doc->loadHTML($result);
    $domx = new DOMXPath($doc);
    $trans_id = $domx->query('//input[@name="trans_id"]');
    foreach ($trans_id as $id) {
        echo "Value: " .  $id->getAttribute('value');
    }
    

    打印:

    Value: Lk+Vz957skV845b7x2DX7iyR1FI=
    

    【讨论】:

    • 感谢@Royal Bg 的帮助。不幸的是,您的代码似乎无法正常工作。我试图提取函数触发的第一个值 ($trans_id->item(0)->nodeValue;) 但似乎它也不起作用。您介意检查评估表达式吗,它可能是错误的。我也尝试使用 foreach 循环,但没有解决问题。
    • @HalisDuraki 我编辑了我的答案,这应该可以按预期工作:)
    • 现在效果很好。此外,我不需要 foreach 循环,因此我将其删除(只有一个名为“trans_id”的标签)并将其替换为 item(0)。已接受答案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 2010-09-10
    • 2012-12-05
    • 2020-11-23
    • 2013-08-07
    • 2015-09-11
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多