Regex ile Yardım (PCRE)

0 Cevap php

Benim PHP uygulamalarında kullanılmak üzere, değişken uzunluk dizeler eşleşen ve yakalamak için bir PCRE'nin regex dize çalışmak için çalışıyorum. Tek bir ayrıştırma eylemleri gerçekleştirmek için (makul ise) isterdim, ama çoğu hesaplama makul görünüyor eğer uygulama mantığı ile bölünmüş birkaç çalışır içine o kadar ayırabilirsiniz.

Metnin çok büyük bloklar içinde yer olabilir bir kaç örnek dizeleri:

{{ var:myVar }}
{{ component:myComponent}}
{{ var:myVar modifier:function[arg1|arg2] }}
{{ region:myRegion modifier:function[arg1|arg2] modifier:function[arg1] }}

Gördüğünüz gibi, hedeflenen dizeleri arasında önemli bir değişiklik olabilir. Özetlenebilir:

{{ type:name modifierType:modifierName[arg1|arg2|...] }}
  • Sınırlayıcılar {{ ve }}.
  • Geçerli bir type ya da name [a-z_][a-z0-9_]* olarak ifade edilir; Orada tek bir type:name çifti olacak ve ilk görünecektir.
  • Geçerli bir modifierType ya da modifierName [a-z_][a-z0-9_] olarak ifade edilir; modifierName köşeli parantez içinde bir ya da daha çok bağımsız değişken bir argüman listesi tarafından takip edilir, [ ve ]. Argüman listesi borularla sınırlanan |. Sıfır ya da daha çok modifierType:modifierName[argumentList] kümeleri olabilir.
  • Dizenin tüm bölümleri bir-ya da-daha fazla boşluk karakterleriyle ayrılmış \s+

Her neyse, sadece {{ type:name }} yeterince kolaydır, ama ben etkili değişken uzunluk değiştirici listeleri kapmak için bir yol anlamaya olamaz eşleşen setleri. Basit bir türü / adı çifti için, ben şu case-insensitive/free-spacing dize kullanıyorum:

'% {{ \s+ (?<type>var|component|region):(?<name>[a-z_][a-z0-9_]*) \s+ }} %ix'

Ben büyük olasılıkla ileriye uyumluluk için genel bir alfasayısal dize yakalamak için tip-list takas için gidiyorum, ama bu şimdi için çalışıyor.

Yani, her iki yakalamada herhangi bir öneri:

{{ component:myComponent }}
{{ var:myVar format:datetime[Y-m-d] container:h3[class=timestamp|id=main] }}

0 Cevap