Php bir dize işleme

7 Cevap php

Böyle KullanıcıHesapAdı gibi belirli bir desen gerçekten uzun bir dizesi vardır: böylece ..... ve: abc userCompany: xyz useremail: a@xyz.com userAddress1: userAddress2: userAddress3: userTown. Bu desen tekrarlar.

Ben KullanıcıHesapAdı değerleri var ki bu dize işlemek için bir yol bulmak gerekiyor: userCompany: vb (yani tercihen bir ilişkisel dizi ya da böyle uygun formatta).

Bunu yapmanın kolay bir yolu var mı ya da ben farklı bölüme kadar bu dize bölmek için kendi mantığı yazmak zorunda olacak?

7 Cevap

Ben çözüm yakın ben arıyordum ne, ben http://www.justin-cook.com/wp/2006/03/31/php-parse-a-string-between-two-strings/ de buldum. Ben bu başkasına yararlı kanıtlıyor umuyoruz. Teşekkür için tüm önerilen çözümleri için herkes.

Bu gibi basit düzenli ifadeler userAccountName:\s*(\w+)\s+ eşleşmelerini yakalamak ve daha sonra bir veri yapısı oluşturmak için yakalanan eşleşmeleri kullanmak için kullanılabilir.

O zaman neredeyse tam olarak ne istediğinizi yapar parse_str, kullanabileceği bir URL (yani, var = veri & var2'ye = veri2) olduğu gibi verileri biçimlendirilmiş olması için düzenleme eğer, sanırım. Lütfen giriş verilerinin bazı bozma basit bir şekilde bu yapardı.

Siz regex veya kendi mantığı kullanmak gerekebilir.

":" Değerler kendi içinde herhangi bir yerde görünmüyor sen dize garanti edilir? Eğer öyleyse, muhtemelen implode alternatif anahtarları ve değerleri bir diziye dize bölmek için kullanabilirsiniz. Daha sonra bu dizi boyunca yürümek ve bunu istediğiniz şekilde biçimlendirmek olurdu. Burada hızla birlikte attı kaba (muhtemelen verimsiz) bir örnek:

<?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);

(Benim mesela ben değerleri hiçbir noktalı virgül var demektir düşünüyorum) regexpi yazabilirsiniz varsa, preg_split veya preg_match_all Böyle ile ayrıştırmak yapabilirsiniz:

<?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);
  }

?>

Bu durumda değilse, biraz daha ayrıntılı olarak dize dilbilgisi tanımlamak lütfen.

PCRE PHP dahildir ve regexpi gibi kullanarak ihtiyaçlarınıza cevap verebilir:

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

the most difficult is to get the good regexp for your needs. you can have a look at http://txt2re.com for some help

I olsaydı, ben bazı işleçleri ile bir json formatında dizeleri dönüştürmek için çalışacağım.

Daha sonra, sadece Json kullanın.