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
(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....
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
(exp1)(exp2)(exp3)|(exp1)(exp3)(exp2)|....
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.
foo
vs.) gerekli kısım eşleşirse bunu hep maçları boş yakalama grubu ()
takip eder: aşağıdaki gibi çalışır.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.\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:
(?=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.
Sanırım regex'leri – DiogoDoreto
Ummm'ye bölmeniz gerekir. php 'yi destekler (? = ...): http://php.net/manual/en/regexp.reference.assertions.php –