1

我有一个特定模式的很长的字符串,例如:

userAccountName: abc userCompany: xyz userEmail: a@xyz.com userAddress1: userAddress2: userAddress3: userTown: ...

等等。这种模式重复。

我需要找到一种方法来处理这个字符串,这样我就有了 , 等的值userAccountName:userCompany:即最好是关联数组或一些这样方便的格式)。

有没有一种简单的方法可以做到这一点,还是我必须编写自己的逻辑来将此字符串拆分为不同的部分?

4

7 回答 7

2

像这样的简单正则表达式userAccountName:\s*(\w+)\s+可用于捕获匹配项,然后使用捕获的匹配项创建数据结构。

于 2009-06-08T06:22:10.880 回答
2

如果您可以安排数据在 URL 中的格式(即 var=data&var2=data2),那么您可以使用 parse_str,我认为它几乎完全符合您的要求。对您的输入数据进行一些修改会以一种直接的方式完成此操作。

于 2009-06-08T06:24:38.770 回答
1

您可能必须使用正则表达式或您自己的逻辑。

您是否保证字符串“:”不会出现在值本身的任何位置?如果是这样,您可以使用implode将字符串拆分为交替键和值的数组。然后,您必须遍历此数组并按照您想要的方式对其进行格式化。这是我快速拼凑的一个粗略(可能效率低下)的示例:

<?php
$keysAndValuesArray = implode(': ', $dataString);
$firstKeyName = 'userAccountName';
$associativeDataArray = array();
$currentIndex = -1;
$numItems = count($keysAndValuesArray);
for($i=0;$i<$numItems;i+=2) {
    if($keysAndValuesArray[$i] == $firstKeyName) {
         $associativeDataArray[] = array();
         ++$currentIndex;
    }
    $associativeDataArray[$currentIndex][$keysAndValuesArray[$i]] = $keysAndValuesArray[$i+1];
}

var_dump($associativeDataArray);
于 2009-06-08T06:26:08.267 回答
1

如果您可以编写一个正则表达式(对于我的示例,我正在考虑值中没有分号),您可以使用 preg_split 或preg_match_all解析它,如下所示:

<?php

  $raw_data = "userAccountName: abc userCompany: xyz";
  $raw_data .= " userEmail: a@xyz.com userAddress1: userAddress2: ";

  $data = array();
  // /([^:]*\s+)?/ part works because the regexp is "greedy"
  if (preg_match_all('/([a-z0-9_]+):\s+([^:]*\s+)?/i', $raw_data,
                     $items, PREG_SET_ORDER)) {
    foreach ($items as $item) {
      $data[$item[1]] = $item[2];
    }
    print_r($data);
  }

?>

如果不是这种情况,请更详细地描述您的字符串的语法。

于 2009-06-08T06:32:26.490 回答
0

PCRE 包含在 PHP 中,可以使用正则表达式来响应您的需求,例如:

if ($c=preg_match_all ("/userAccountName: (<userAccountName>\w+) userCompany: (<userCompany>\w+) userEmail: /", $txt, $matches))
{
  $userAccountName = $matches['userAccountName'];
  $userCompany = $matches['userCompany'];
  // and so on...
}

最困难的是获得满足您需求的良好正则表达式。你可以看看http://txt2re.com寻求帮助

于 2009-06-08T06:43:13.367 回答
0

I think the solution closest to what I was looking for, I found at http://www.justin-cook.com/wp/2006/03/31/php-parse-a-string-between-two-strings/. I hope this proves useful to someone else. Thanks everyone for all the suggested solutions.

于 2009-06-12T07:56:03.787 回答
-1

如果我是你,我会尝试使用一些正则表达式将字符串转换为 json 格式。

然后,只需使用 Json。

于 2009-06-08T07:09:19.210 回答