tanım listesini ilgili regex soru Redux

3 Cevap php

Herhangi bir değer yok bu veri özelliklerini dışarı atmak için bir yol bulmaya çalışıyorum. Yardım için teşekkürler.

Benim şu anki regex kodu, Tomalak sayesinde bu gibi görünüyor

Bulmak Regex

([^=|]+)=([^|]+)(?:\||$)

Yerine Regex

<dt>$1</dt><dd>$2</dd>

Veriler bu gibi görünüyor

Kıl Malzeme = | Tel Malzeme = Çelik | Dia = 4 | Grit = | Kıl Diam = | Tel Ölçü = içinde 0.0095 | Arbor Diam = |. Arbor Konu - TPI veya Pitch = 1/2 - 3/8 | No Düğüm = | Yüz Genişliği = 1/2 | Face Plate Kalınlığı = 7/16 | = 7/8 Boy Trim | Kök Diam = | Hız = 6000 rpm [Max] | No Satır = | Renk = | Hub Malzeme = | Yapı = | Tool Shape = | yapışması için pürüzlendirilebilir Başvuruları = temizleme pas, ölçek ve kir, Hafif Çapak Alma, Kenar harmanlayan, Finish hazırlık kaplama öncesi veya boyama | Uygulanabilir Malzemeler = | Tür = | = Düz Taşlama, Bench / Kaideye Taşlama, Dik Açı Değirmenleri ile Kullanılan | Ambalaj Tipi = | Miktar = 1 paket başına |. Wt =

Sonuçta böyle olmalıdır

 <dt>Wire Material</dt><dd>Steel</dd><dt>Dia.</dt><dd>4 in</dd><dt>Wire Size</dt><dd>0.0095 in</dd>

Bu değil

 Bristle Material=|<dt>Wire Material</dt><dd>Steel</dd><dt>Dia.</dt><dd>4 in</dd>Grit=|Bristle Diam=|<dt>Wire Size</dt><dd>0.0095 in

3 Cevap

Burada düzenli ifadeler kullanmadan PHP bunu nasıl olduğunu:

$parts_list = explode('|', "Bristle Material=|Wire M....");
$parts      = "";

foreach( $parts_list as $part ){
	$p = explode('=', $part);
	if(!empty($p[1])) $parts .= "<dt>$p[0]</dt>\n<dd>$p[1]</dd>\n";
}

echo $parts;

Ve burada düzenli ifadeler ile bunu nasıl olduğunu:

$parts = preg_replace( 
    array('/([^=|]*)=(?:\||$)/','/([^=|]*)=([^|]+)(?:\||$)/'),
    array('', '<dt>$1</dt><dd>$2</dd>'),
    $inputString 
);

echo $parts;

Update

Bu regex ifadeler bir dizi ve yedek dizeleri bir dizi alır preg_replace PHP özel yerini özelliğini kullanıyor. Fonksiyonun array() sözdizimi temelde eşittir:

If I can match this: /([^=|]*)=(?:\||$)/ then replace it with an empty string.
If I can match this: /([^=|]*)=([^|]+)(?:\||$)/ then replace it with <dt>$1</dt><dd>$2</dd>

Regex editörü test etmek için, (/([^=|]*)=(?:\||$)/) ardından ilk ifadenin sonucu ikinci ifadeyi çalıştırın Önce ilk ifadeyi çalışır.

([^=|]*)=([^|]*)(?:\||$)

bir değeri dışarı olanları atlamak için, bu deneyin:

(?:[^=|]*=|([^=|]*)=([^|]+))(?:\||$)

Eğer preg_match burada ziyade preg_replace istediğim gibi görünüyor

 preg_match_all('~([^|]+)=([^|\s][^|]*)~', $str, $matches, PREG_SET_ORDER);
 foreach($matches as $match)
      echo "<dt>{$match[1]}</dt><dd>{$match[2]}</dd>\n";