2011-11-22 10 views
5

Düzenli ifademde bir tür "AND" mantıksal operatörü kullanmak isterim. Mantıksal işleç VE normal php ifadesiyle

(?=exp1)(?=exp2) 

Ama PHP ?= içinde

çalışmak ve PHP dilinde benim programı yazmak gerekmez: Bu çalıştı. Başka bir yöntem var mı? İfade, tüm koşulları ve herhangi bir sırada mevcutsa eşleşmelidir.

(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|.... 
+0

Sanırım regex'leri – DiogoDoreto

+4

Ummm'ye bölmeniz gerekir. php 'yi destekler (? = ...): http://php.net/manual/en/regexp.reference.assertions.php –

cevap

9

PHP lookahead ifadeleri destekler yapar: ben gibi her permütasyon yazmak istemiyorum. Muhtemelen onları doğru şekilde kullanmıyorsunuzdur.

Eğer foo, bar ve baz üçünü içeren bir dize eşleştirmek istediğiniz varsayarsak, bu dizeleri foobarbaz veya barbazfoo vb Ancak, bu maç için bir maç dönecektir

^(?=.*foo)(?=.*bar)(?=.*baz) 

regex gerek boş dize olacak (çünkü lookaheads herhangi bir karakter tüketmiyor). Eğer düzenli ifade dizesini kendisini dönmek istiyorsanız, tüm üç kriteri yerine getirmesi halinde daha sonra tüm dizeyi maç olacak

^(?=.*foo)(?=.*bar)(?=.*baz).* 

kullanın.

Ben sadece bu da foonly bartender bazooka gibi bir dize maç olacak

if (preg_match('/^(?=.*foo)(?=.*bar)(?=.*baz)/s', $subject)) { 
    # Successful match 
} else { 
    # Match attempt failed 
} 

dikkate alınız kullanmak. sen, sen küçük bir hile yapabilir (sadece biri üç ifadelerin her birinin saf permütasyon izin) olduğunu istemiyorsanız:

^(?:foo()|bar()|baz()){3}\1\2\3$ 

maçlar foobarbaz, foobazbar, barfoobaz, barbazfoo, bazfoobar ve bazbarfoo (ve başka hiçbir şey). "Hile", Jan Goyvaerts ve Steven Levithan'ın mükemmel kitabı olan "Regular Expressions Cookbook"'dan (s. 304) esinlenmiştir.

  • Her gerekli kısım (foo vs.) gerekli kısım eşleşirse bunu hep maçları boş yakalama grubu () takip eder: aşağıdaki gibi çalışır.
  • Dolayısıyla, gerekli üç parçanın tümü eşleştiyse, üç boş yakalama grubunun tümü eşleşti.
  • Aşağıdaki geriatımlar yalnızca, yakalama gruplarının her biri eşleşmeye katıldıysa başarılı olur.
  • Dize foobarbar ise, (?:foo()|bar()|baz()){3} bölümü eşleşecek, ancak \3 başarısız oluyor, dolayısıyla genel normal ifade başarısız oluyor.
  • Her üçü de maçta yer aldıysa, \1\2\3 dizenin sonunda eşleşmeyi başarır, çünkü yakalama gruplarının her biri boş dizeden başka bir şey içermez. @ Tim'in cevap ilaveten
+0

İyi, eksiksiz cevap. +1 – FailedDev

+0

@tim bunun için kaynak veya tamamlayıcı sağlayabilir misiniz? Daha önce hiç foo() | bar() | baz() gibi bir şey görmedim. – bozdoz

+0

Sanırım ne soruyorum boş parantezlerin önemi nedir? – bozdoz

1

:

(?=exp1)(?=exp2) 

Bu doğru olamaz.Düz İngilizce'de diyorsunuz: Burada izlenen metnin exp1 olduğundan emin olun ve burada izlenen metnin exp2 olduğundan emin olun. Bu doğru değil. Asla uyuşmayacak.