2012-07-17 113 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'];