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

私が探していたものに最も近い解決策だと思います。http://www.justin-cook.com/wp/2006/03/31/php-parse-a-string-between-two-strings/で見つけました。これが他の誰かに役立つことを願っています。提案されたすべての解決策をみんなに感謝します。

于 2009-06-12T07:56:03.787 に答える
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 に答える
-1

もし私があなただったら、正規表現を使って文字列を json 形式に変換しようとします。

次に、Json を使用します。

于 2009-06-08T07:09:19.210 に答える