2013-06-22 26 views
7

Tek bir dizeden birden çok bölüm/koşul ayıklamak için bir php regex yapmaya çalışıyorum ... size neden bahsettiğimi göstereyim; Gördüğünüz gibiphp regex dizesinden birden çok eşleşme ayıklamak için

part "C28" 
{ type  : "1AB010050093", 
    %cadtype : "1AB010050094", 
    shapeid : "2_1206", 
    descr  : "4700.0000 pFarad 10.00 % 100.0 - VE5-VS3", 
    insclass : "CP6A,CP6B", 
    gentype : "RECT_032_016_006", 
    machine : "SMT", 
    %package : "080450E", 
    %_item_number: "508", 
    %_Term_Seq : "" } 
part "C29" 
{ type  : "1AB008140029", 
    shapeid : "2_1206", 
    descr  : "150.0000 pFarad 5.00 % 100.0 Volt NP0 CERAMIC CAPACITOR", 
    insclass : "CP6A,CP6B", 
    gentype : "RECT_032_016_006", 
    machine : "SMT", 
    %package : "080450E", 
    %_item_number: "3", 
    %_Term_Seq : "" } 

, alıntıda veriler iki kez tekrarlar: bu toplam dosya içeriğinin (gerçek içeriği bu grupların yüzlerce içerir) bir alıntıdır. Aşağıdaki bütün dosyası üzerinden arama ve ayıklamak gerekir: kelime "bir parçası" sonra

  • dize - hangi "tip" özelliği sonra "C28" ya da "C29"
  • dize olurdu - hangi "1AB010050093" olacağını ya da "1AB008140029"

Yani, aslında, bu dosyanın dışında parçasıdır başvuruları ve ilgili türleri almak gerekir ... ve izlenmesi gereken en iyi yolu emin değilim Bunu yapıyor.

Lütfen yardım için daha fazla bilgi gerekirse lütfen bildirin!

+0

Bu veri türü için Json çözümleyici kullanmamanızın bir nedeni var mı? –

+1

@Denomales Benzer görünmekle birlikte, örnek JSON verisi değildir ve PHP'nin 'json_decode' ile çalışmayacaktır. –

+0

Yeterince adil. Sormak zorundaydım. –

cevap

11

Açıklama

Bu ifade yapacaktır:

  • yakalama ref
  • yakalama gibi grup adı type ve descr alanların değerleri. adlandırılmış gruba konmalıdır yakalanan
  • Tür alanı partnumber
  • alanlar vücudun
  • descr alan isteğe bağlıdır ve varsa sadece Yakalanması gereken herhangi bir sırada ortaya çıkabilir çağırdı. (?: ... )?`` brackets around the descri` alan, bu kadar regex motoru boşluk görmezden x seçeneği kullanmak için olacak bu yüzden bu tek ifadesidir isteğe bağlı alanı

Not yapar.

^part\s"(?P<ref>[^"]*)"[^{]*{ 
(?:(?=[^}]*\sdescr\s*:\s+"(?P<descr>[^"]*)"))? 
(?=[^}]*\stype\s*:\s+"(?P<type>[^"]*)") 

enter image description here

PHP Kod Örnek:

Girişi Metin

part "C28" 
{ type  : "1AB010050093", 
    %cadtype : "1AB010050094", 
    shapeid : "2_1206", 
    descr  : "4700.0000 pFarad 10.00 % 100.0 - VE5-VS3", 
    insclass : "CP6A,CP6B", 
    gentype : "RECT_032_016_006", 
    machine : "SMT", 
    %package : "080450E", 
    %_item_number: "508", 
    %_Term_Seq : "" } 
part "C29" 
{ type  : "1AB008140029", 
    shapeid : "2_1206", 
    descr  : "150.0000 pFarad 5.00 % 100.0 Volt NP0 CERAMIC CAPACITOR", 
    insclass : "CP6A,CP6B", 
    gentype : "RECT_032_016_006", 
    machine : "SMT", 
    %package : "080450E", 
    %_item_number: "3", 
    %_Term_Seq : "" } 
part "C30" 
{ type  : "1AB0081400 30", 
    shapeid : "2_1206 30", 
    insclass : "CP6A,CP6B 30", 
    gentype : "RECT_032_016_006 30", 
    machine : "SMT 30", 
    %package : "080450E 30 ", 
    %_item_number: "3 30 ", 
    %_Term_Seq : "30" } 

Kod

<?php 
$sourcestring="your source string"; 
preg_match_all('/^part\s"(?P<ref>[^"]*)"[^{]*{ 
(?:(?=[^}]*\sdescr\s*:\s+"(?P<descr>[^"]*)"))? 
(?=[^}]*\stype\s*:\s+"(?P<partnumber>[^"]*)")/imsx',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 
?> 

Maçlar

, bu deseni kullanabilirsiniz her gruplar aynı yapıya sahip varsayarsak
$matches Array: 
(
[ref] => Array 
    (
     [0] => C28 
     [1] => C29 
     [2] => C30 
    ) 

[descr] => Array 
    (
     [0] => 4700.0000 pFarad 10.00 % 100.0 - VE5-VS3 
     [1] => 150.0000 pFarad 5.00 % 100.0 Volt NP0 CERAMIC CAPACITOR 
     [2] => 
    ) 

[partnumber] => Array 
    (
     [0] => 1AB010050093 
     [1] => 1AB008140029 
     [2] => 1AB0081400 30 
    ) 

) 
+1

gerçekten güzel cevap! :) – hek2mgl

+0

Çok teşekkür ederim :) –

+0

@Denomales Nereden regex görselleştirme görüntüsünü alıyorsunuz? – tristanbailey

2

:

preg_match_all('~([^"]++)"[^{"]++[^"]++"([^"]++)~', $subject, $matches); 
print_r($matches); 

DÜZENLEME:

Uyarı: ayıklamak için daha fazla bilgi varsa, Verilerinizi kolayca isteyebilir, örneğiz:

$data = <<<LOD 
part "C28" 
{ type  : "1AB010050093", 
    %cadtype : "1AB010050094", 
    shapeid : "2_1206", 
    descr  : "4700.0000 pFarad 10.00 % 100.0 - VE5-VS3", 
    insclass : "CP6A,CP6B", 
    gentype : "RECT_032_016_006", 
    machine : "SMT", 
    %package : "080450E", 
    %_item_number: "508", 
    %_Term_Seq : "" } 
part "C29" 
{ type  : "1AB008140029", 
    shapeid : "2_1206", 
    descr  : "150.0000 pFarad 5.00 % 100.0 Volt NP0 CERAMIC CAPACITOR", 
    insclass : "CP6A,CP6B", 
    gentype : "RECT_032_016_006", 
    machine : "SMT", 
    %package : "080450E", 
    %_item_number: "3", 
    %_Term_Seq : "" } 
LOD; 
$trans = array("}\n" => '}, ' , 'part' => '' , 
       "\"\n{" => ':{"' , ':'  => '":' , 
       "\",\n" => '","'); 

$data = str_replace(array_keys($trans), $trans, $data); 
$data = preg_replace('~\s*+"\s*+~', '"', $data); 
$json_data =json_decode('{"'.substr($data,1).'}'); 

foreach ($json_data as $key=>$value) { 
    echo '<br/><br/>part: ' . $key . '<br/>type: ' . $value->type;  
} 
İlgili konular