Каков наилучший способ разобрать Paypal NVP в PHP?
Мне нужна функция, которая будет правильно анализировать NVP в массиве PHP. Я использовал код, предоставленный paypal, но он не работал, когда длина строки была указана рядом с именем.
Вот что я до сих пор.
private function parseNVP($nvpstr)
{
$intial=0;
$nvpArray = array();
while(strlen($nvpstr))
{
//postion of Key
$keypos= strpos($nvpstr,'=');
//position of value
$valuepos = strpos($nvpstr,'&') ? strpos($nvpstr,'&'): strlen($nvpstr);
/*getting the Key and Value values and storing in a Associative Array*/
$keyval=substr($nvpstr,$intial,$keypos);
$vallength=$valuepos-$keypos-1;
// check if the length is explicitly specified
if($braketpos = strpos($keyval,'['))
{
// override value length
$vallength = substr($keyval,$braketpos+1,strlen($keyval)-$braketpos-2);
// get rid of brackets from key name
$keyval = substr($keyval,0,$braketpos);
}
$valval=substr($nvpstr,$keypos+1,$vallength);
//decoding the respose
if (isValidXMLString("<".urldecode($keyval).">".urldecode( $valval)."</".urldecode($keyval).">"))
$nvpArray[urldecode($keyval)] =urldecode( $valval);
$nvpstr=substr($nvpstr,$keypos+$vallength+2,strlen($nvpstr));
}
return $nvpArray;
}
Эта функция работает большую часть времени.
Ответы
Ответ 1
Лучшим способом является функция parse_str. Он будет анализировать строку URLencoded в массиве PHP.
Итак, ваш код будет выглядеть так:
private function parseNVP($nvpstr)
{
$paypalResponse = array();
parse_str($nvpstr,$paypalResponse);
return $paypalResponse;
}
Ответ 2
Поймать много, я нашел это:
function deformatNVP($nvpstr) {
$intial=0;
$nvpArray = array();
while(strlen($nvpstr)){
//postion of Key
$keypos= strpos($nvpstr,'=');
//position of value
$valuepos = strpos($nvpstr,'&') ? strpos($nvpstr,'&'): strlen($nvpstr);
/*getting the Key and Value values and storing in a Associative Array*/
$keyval=substr($nvpstr,$intial,$keypos);
$valval=substr($nvpstr,$keypos+1,$valuepos-$keypos-1);
//decoding the respose
$nvpArray[urldecode($keyval)] =urldecode( $valval);
$nvpstr=substr($nvpstr,$valuepos+1,strlen($nvpstr));
}
return $nvpArray;
}
Источник.
Я НЕ владею этим кодом, и я его не тестировал, поэтому используйте его с осторожностью.