2012-07-17 37 views
0

使用Recurly API,返回以下文本。我試圖弄清楚的是用PHP從這個字符串中提取值並將它們放入PHP變量中的最簡單方法。使用PHP從文本字符串中提取值?

我已經看過PHP手冊中的各種方法來查找文本,但對PHP來說是新的確切的過程,以便在我發現它們的位置仍然不明顯的情況下實際獲取這些值。

例如,我將如何拉取plan_code的值併除去值附近的引號以便結果爲$plan = 'starter'

Recurly_Subscription [HREF = HTTPS://api.recurly.com/v2/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxx] 帳戶= < Recurly_Stub [帳戶] HREF = HTTPS://api.recurly.com/v2/accounts/1 >, activated_at =「2012-07-14 12:55:47 +00:00」,currency =「USD」, current_period_ends_at =「2012-08-14 12:55:47 +00:00」, current_period_started_at =「2012-07-14 12:55:47 +00:00」, plan =「Recurly_Plan [href = https://api.recurly.com/v2/plans/starter] name =」Starter「 ,plan_code =「starter」, setup_fee_in_cents =「< Recurly_CurrencyList [] > 「 unit_amount_in_cents =」 < Recurly_CurrencyList [] > 「>」, 數量= 2,狀態= 「有效」,subscription_add_ons = [], unit_amount_in_cents = 1200, UUID = 「1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3」

+5

您確定這是返回的*確切*文本嗎? [文檔](http://docs.recurly.com/api/subscriptions)說它返回XML。 – 2012-07-17 15:25:10

回答

3

您可以使用Recurly的PHP API:

$result = Recurly_js::fetch($_POST['recurly_token']); 
$plan = $result->plan_code; 

令牌是認購對象。然後,您可以檢索有關帳戶及其計費信息這樣的附加信息:

$account = $result->account->get(); 
$billing = $account->billing_info->get(); 

檢索帳戶字段(例如賬戶持有人的名字)和它的結算信息(例如記錄的信用卡號碼最後4個位數)以上提取plan_code的方式相同。

這樣做比在Recurly的文檔中找到如何操作要容易得多!

2

一個技巧是把它變成查詢字符串語法,並使用parse_str(original,array)。

$original = 'Recurly_Subscription[href=https://api.recurly.com/v2/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxx] account=, activated_at="2012-07-14 12:55:47 +00:00", currency="USD", current_period_ends_at="2012-08-14 12:55:47 +00:00", current_period_started_at="2012-07-14 12:55:47 +00:00", plan="Recurly_Plan[href=https://api.recurly.com/v2/plans/starter] name="Starter", plan_code="starter", setup_fee_in_cents="", unit_amount_in_cents="">", quantity=2, state="active", subscription_add_ons=[], unit_amount_in_cents=1200, uuid="1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3"'; 

$newstring = str_replace(", ", "&", $original); // turns into querystring format &var=val 
// you may need to use addslashes and/or replace the double quotes surrounding vars. 

接下來,使用parse_str和它建立的名稱/值的關聯數組:

parse_str($newstring, $myarray); 

然後你就可以打印出來,看看它的外觀和調整:

print_r($myarray); 
+0

這裏是的鏈接parse_str文件:http://php.net/manual/en/function.parse-str.php – 2012-07-17 15:45:13

1
function value($string, $s) { 
     $pos = strpos($string, $s); 
     if($pos!==FALSE) { 
      $pos += strlen($s) + 2; 
      $fpos = $pos; 
      while ($string[$fpos] != '"') { 
       ++$fpos; 
      } 
      $result = substr($string, $pos, $fpos-$pos); 
     } else { 
      $result = ''; 
     } 
     return $result; 
    } 

    $string = 'Recurly_Subscription[href=https://api.recurly.com/v2/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxx] account=<Recurly_Stub[account] href=https://api.recurly.com/v2/accounts/1>, activated_at="2012-07-14 12:55:47 +00:00", currency="USD", current_period_ends_at="2012-08-14 12:55:47 +00:00", current_period_started_at="2012-07-14 12:55:47 +00:00", plan="Recurly_Plan[href=https://api.recurly.com/v2/plans/starter] name="Starter", plan_code="starter", setup_fee_in_cents="<Recurly_CurrencyList []>", unit_amount_in_cents="<Recurly_CurrencyList []>">", quantity=2, state="active", subscription_add_ons=[], unit_amount_in_cents=1200, uuid="1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3"'; 
    $s = 'plan_code'; 
    echo value($string, $s); 

這對我有效,但你也可以嘗試以下功能:

$out = sscanf('Recurly_Subscription[href=https://api.recurly.com/v2/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxx] account=<Recurly_Stub[account] href=https://api.recurly.com/v2/accounts/1>, activated_at="2012-07-14 12:55:47 +00:00", currency="USD", current_period_ends_at="2012-08-14 12:55:47 +00:00", current_period_started_at="2012-07-14 12:55:47 +00:00", plan="Recurly_Plan[href=https://api.recurly.com/v2/plans/starter] name="Starter", plan_code="starter", setup_fee_in_cents="<Recurly_CurrencyList []>", unit_amount_in_cents="<Recurly_CurrencyList []>">", quantity=2, state="active", subscription_add_ons=[], unit_amount_in_cents=1200, uuid="1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3"', 'Recurly_Subscription[href=https://api.recurly.com/v2/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxx] account=<Recurly_Stub[account] href=https://api.recurly.com/v2/accounts/1>, activated_at="2012-07-14 12:55:47 +00:00", currency="USD", current_period_ends_at="2012-08-14 12:55:47 +00:00", current_period_started_at="2012-07-14 12:55:47 +00:00", plan="Recurly_Plan[href=https://api.recurly.com/v2/plans/starter] name="Starter", plan_code="%s", setup_fee_in_cents="<Recurly_CurrencyList []>", unit_amount_in_cents="<Recurly_CurrencyList []>">", quantity=2, state="active", subscription_add_ons=[], unit_amount_in_cents=1200, uuid="1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3"', $value); 
echo substr($value,0,strlen($value)-2); //output: starter 
2

幾種處理方法。

可能是最簡單的一種:如果能夠獲得更符合標準的結果,請查看API。 PHP有內置函數來處理XML,JSON和其他幾種格式,這樣你就可以得到一個數組或一個可以訪問信息位的對象。

一種可能的方式使用這種格式: 分裂在,,再次分裂在=得到鍵=>值對。 (但是,您可能需要切斷第一行,因爲在此之後我沒有看到,。) 畫稿,未經測試:

<?php $result = your_api_call(); 
$chunks = explode(',', $result); 
$resultAsArray = array(); 
foreach ($chunks as $biggerPart) { 
    $parts = explode('=', $biggerPart); 
    $tmpKey = trim($parts[0]); 
    $tmpValue = str_replace('"', '', $parts[1]); 
    $resultAsArray[$tmpKey] = $tmpValue; 
} 

echo $resultAsArray['plan_code'];