Bana bu düzenli ifadeye yapmak yardımcı olabilir?

4 Cevap php

Ben bir metin dizesini üç parça almak ve onları bir diziye dönmek için gereken bir komut dosyası var. Çalışıyor ve başarısız bir çift sonra ben o iş için alamadım.

Metin dizeleri şöyle olabilir:

Some place
Some place (often text in parenthesis)
Some place (often text in parenthesis) [even text in brackets sometimes]

Ben üçe bu dizeleri bölmek gerekir:

{Some place} ({often text in parenthesis}) [{even text i brackets sometimes}]

Dönmelidir Hangi:

1: Some place
2: often text in parenthesis
3: even text in brackets sometimes

Bu kolay bir görev olması gerektiğini biliyorum, ama ben doğru normal ifadeyi çözemediler. Bu PHP kullanılacak.

Şimdiden teşekkürler!

4 Cevap

Böyle bir şey deneyin:

$result = preg_match('/
  ^ ([^(]+?)
  (\s* \( ([^)]++) \))?
  (\s* \[ ([^\]]++) \])?
  \s*
  $/x', $mystring, $matches);

print_r($matches);

Bu örnekte, büyük olasılıkla [1], $ maçı [3], ve $ eşleşmeler $ en çok ilgi olacağını unutmayın [5].

Üç düzenli ifadelerin içine sorunu bölünmüş. Eğer ilk parantez önce her karakteri nereden ilkinden sonra, sizin konumunuzu kaydetmek - sadece ekstre dize uzunluğu aynı.

Sonra ikinci adımda, aynı şeyi, ama kapatma parantezi kadar her şeyi kapmak. (İç içe parantezler çok bu biraz daha karmaşık ama değil yapmak.) Yine, ikinci dizenin sonuna bir gösterici kaydedin.

Üçüncü dize alma sonra saçmadır.

Herhalde parantez ve parantez hem ile başlayan, ve bu başarısız olursa daha az öğeleri geri düşen, üç normal ifadeler olarak yapardım.

^(.*?)\s+\((.*?)\)\s+\[(.*?)\]\s+$

eğer başarısız sonra deneyin:

^(.*?)\s+\((.*?)\)\s+$

bu da başarısız olursa deneyin:

^\s+(.*?)\s+$

Ben onlar bir düzenli ifadeye birleştirilebilir olabilir emin değilim, ama denemek istiyorum.

Bu böyle bir şey?

([^(]++)(?: \(([^)]++)\))?(?: \[([^\]]++)\])?