2013-06-04 39 views
4

我已经从其他服务被发布的数据作为一个字符串: heading="firstname","lastname"&user_1382926="Mike",Smith"&user_1383059="Sonny","Williams"&user_1303EM000014="Mike","Jones"解析字符串,然后张贴

我失去了在这个解析并且由于用户_ *可以是任何东西,它不洽。

我想:

$query = explode('&', 'heading="firstname","lastname"&user_1382926="Mike",Smith"&user_1383059="Sonny","Williams"&user_1303EM000014="Mike","Jones"'); 
$params = array(); 

foreach($query as $param){ 
list($name, $value) = explode('=', $param); 
echo $params[urldecode($name)][] = urldecode($value); 
} 

但它只是给我:

"firstname","lastname""Mike",Smith""Sonny","Williams""Mike","Jones" 

我希望能够将其发布到:

$firstname = $_POST['firstname']; 
$lastname = $_POST['lastname']; 
$stmt = $mysqli->prepare("INSERT INTO usertest (firstname,lastname) VALUES (?,?)"); 
$stmt->bind_param('ss', $firstname, $lastname); 
$stmt->execute(); 

我如何解析这个为了然后妥善发布?

+1

+1尝试;这些日子非常罕见。 – Kermit

+0

你想把它发布到外部URL? – Deepsy

+0

是的,我想将其发布到外部URL。 – Joe

回答

1

很粗糙,但是这是我到了结局:

$names = array(); 
$string = 'heading="firstname","lastname"&user_1382926="Mike","Smith"&user_1383059="Sonny","Williams"&user_1303EM000014="Mike","Jones"'; 

$arr = explode("&",$string); 

foreach($arr as $key_values){ 
    if(substr($key_values,0,5) == 'user_'){ 
     $piecies = explode("=",$key_values); 
     foreach($piecies as $key=>$val){ 
      if($key%2==0){ 
       continue; 
      } 
      preg_match_all('/"(.*?)","(.*?)"/',$val,$first_last_name); 
      $names[] = array('firstname'=>$first_last_name[1],'lastname'=>$first_last_name[2]); 
     } 
    } 
} 

echo '<pre>',print_r($names),'</pre>'; 

foreach($names as $name){ 
    $firstname = $name['firstname']; 
    $lastname = $name['lastname']; 
    $stmt = $mysqli->prepare("INSERT INTO usertest (firstname,lastname) VALUES (?,?)"); 
    $stmt->bind_param('ss', $firstname, $lastname); 
    $stmt->execute(); 
} 

注:我史密斯之前加了双引号("Mike","Smith" )在你原来的字符串中,因为我希望它只是从OP中丢失。

+0

这个工作,我做的唯一的变化是: 'foreach($ names as $ name){ $ firstname = $ name ['firstname'] [0]; $ lastname = $ name ['lastname'] [0]; $ stmt = $ mysqli-> prepare(“INSERT INTO loantest(firstname,lastname)VALUES(?,?)”); $ stmt-> bind_param('ss',$ firstname,$ lastname); $ stmt-> execute(); }' – Joe

0

首先你的字符串似乎缺少一个报价。见

&user_1382926="Mike",Smith" 

其次,使用爆炸似乎是一个好主意,因为你会爆炸&和=引用的领域内。

我通常会采用的方式是状态机。使用正则表达式(请参阅PHP - split String in Key/Value pairs)要简单得多。

你试图匹配的语言似乎是:

  • 键可以由1个或多个字母数字或下划线字符。
  • 值是带引号的字符串的一个逗号分隔的列表
  • 键和值由等号
  • 键值对由一个&

正则表达式中分离得到的键值配对分离:

$regex = '/&?([^=]+)=([^&]+)/'; 
preg_match_all($regex, $header, $r); 
$result = array_combine($r[1], $r[2]); 

$ result中的第一个条目将包含键'header'和值''firstname','lastname''。

现在我们只需要将结果中的值从一个字符串转换为一个字符串列表。

foreach ($result as $key => $value) { 
    $regex = '("[^"]+")'; 
    preg_match_all($regex, $value, $r); 
    $result[$key] = $r; 
} 

这是缺少一些边缘情况下,如值内的转义报价,但应适用于大多数情况。

在你的榜样它产生:

Array 
    (
    [heading] => Array 
     (
      [0] => "firstname" 
      [1] => "lastname" 
     ) 

    [user_1382926] => Array 
     (
      [0] => "Mike" 
      [1] => "Smith" 
     ) 

    [user_1383059] => Array 
     (
      [0] => "Sonny" 
      [1] => "Williams" 
     ) 

    [user_1303EM000014] => Array 
     (
      [0] => "Mike" 
      [1] => "Jones" 
     ) 
) 
0

我讨厌这样的答案,但是你对这篇文章有任何控制权吗?这些数据是一团糟,完全不符合标准。

它应该是这样的......你也知道:

firstname=bob&lastname=smith&user=123654&heading=someheading&... 

现在,即使你有多人在一个岗位来了,那也没关系 - 只要他们是有序的。那会是什么样子......

firstname=bob&lastname=smith&firstname=william&lastname=jones 

当你得到这样的数据,你可以分析它想:

foreach($_POST['firstname'] as $k => $v){ 
    echo "Key: ".$k; 
    echo " Value: ".$v; 
} 

将打印 重点:姓值:鲍勃重点:姓值:威廉

+0

不幸的是我无法控制它。这是问题的一部分。 – Joe

0

由于作者写道:“是的,我想将其发布到外部URL。” “”不幸的是我无法控制它,这是问题的一部分。“ 我想你的问题可以像这样解决。

警告:这不是最好的解决方案,它可能工作,但它会导致开销。请尝试更好地解释你想要达到的目标。

$url = 'user_1382926="Mike","Smith"&user_1383059="Sonny","Williams"&user_1303EM000014="Mike","Jones"'; 
    $query = explode('&', str_replace('"', '', urldecode($url))); 

    $params = array(); 

    foreach($query as $param) 
    { 
     list($name, $value) = explode('=', $param); 
     $q = explode(',', $value); 
     $params[$name] = 'firstname=' . $q[0] . '&lastname=' . $q[1]; 
    } 

    $url = 'http://domain.com/post.php'; 


    $ch = curl_init(); 

    foreach ($params as $current) 
    { 
     curl_setopt($ch,CURLOPT_URL, $url); 
     curl_setopt($ch,CURLOPT_POST, 2); 
     curl_setopt($ch,CURLOPT_POSTFIELDS, $current); 

     $result = curl_exec($ch); 
    } 

    curl_close($ch);