2013-11-10 5 views
0

Я пытаюсь закодировать простой скрипт с curl, но проблема в том, что мне нужно собрать специальный ключ, который генерируется при каждом новом запросе POST (onLoad()). Проблему можно легко пропустить, создав новый элемент DOM и получив значение с помощью функции GetElementById из DOM, но в этом случае нет «id», объявленного в конкретном теге, с которого я хочу вернуть значение. Есть только имя.GetElementById альтернативный

Пример:

<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); 
?> 

Но, честно говоря, я не был в состоянии получить результат от этой функции, потому что, ну, это не exsist. Поиск в Google помогает мне получить результаты с помощью getElementsByTagName, которые после чтения документации из официального сайта PHP не решают мою проблему.

Заметка в конце: я не хочу включать Javascripting, только чистый PHP.

Заранее благодарен,
Отношения.

ответ

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= 
+0

Благодарим Вас за помощь @Royal Bg. К сожалению, кажется, что ваш код работает неправильно. Я попытался извлечь первое значение, по которому запускается функция ($ trans_id-> item (0) -> nodeValue;), но кажется, что она тоже не работает. Не могли бы вы проверить выражение оценки, это может быть неправильно. Я также попытался использовать цикл foreach, но это не решило проблему. – sensation

+0

@HalisDuraki Я отредактировал свой ответ, это должно работать как ожидалось :) –

+0

Теперь это хорошо работает. Кроме того, мне не нужен цикл foreach, поэтому я удалил его (есть только один тег с именем «trans_id») и заменил его на «item (0)». Ответ принят. – sensation