2009-06-08 9 views
1

私は、特定のパターン、例えば、userAccountName:abc userCompany:xyz userEmail:[email protected] userAddress1:userAddress2:userAddress3:userTown:.....などのような、本当に長い文字列を持っています。このパターンは繰り返されます。PHPで文字列を処理する

この文字列を処理して、userAccountName:、userCompany:などの値を持つようにする必要があります(連想配列や便利な形式などが好ましい)。

これを行う簡単な方法はありますか、この文字列を別の部分に分割する独自のロジックを作成する必要がありますか?

+1

あなた自身のロジックを書く必要があります。あなたが望むことをするための組み込み関数はありません。 –

答えて

2

このような単純な正規表現userAccountName:\s*(\w+)\s+を使用して一致をキャプチャし、キャプチャした一致を使用してデータ構造を作成することができます。

2

データをURL形式(つまり、var = data & var2 = data2)に整理することができれば、ほぼ正確にparse_strを使うことができます。あなたの入力データのいくつかのmanglingは、これを簡単な方法で行います。

1

regexまたは独自のロジックを使用する必要があります。

文字列「:」が値自体のどこにも表示されないことが保証されていますか?その場合は、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); 
1

(私の例のために私が検討している値にはセミコロンがありませんが)、あなたがpreg_splitでそれを解析することができますかこのようなpreg_match_all:付属していない場合

<?php 

    $raw_data = "userAccountName: abc userCompany: xyz"; 
    $raw_data .= " userEmail: [email protected] 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); 
    } 

?> 

は、もう少し詳細にあなたの文字列の文法を記述してください。

+0

[^:] +後続の「ラベル」をあまりにも掴みませんか? – PatrikAkerstrand

+0

はい、申し訳ありませんが、それに気付かなかった。より適切な解決策を使って投稿を編集します(preg_splitではなくpreg_match_allを使用します)。もっと思って、投稿する前にすべてを再チェックしなければなりません... – drdaeman

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を見ることができます

0

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

次に、Jsonを使用します。

関連する問題