PHP nasıl Düzenli ifadeler kullanarak BÜTÜN terimleri aynı olabilir?

4 Cevap php

Ben bir OR davayı, preg_match( "/(word1|word2|word3)/i", $string ); nasıl kontrol anladım. Ne ben çözemiyorum bir AND davayı maç nasıl. Ben dize TÜM terimleri (harf duyarsız) içerdiğini kontrol etmek istiyorum.

4 Cevap

Bu lookahead kullanan, örneğin tek bir regex bir AND maç yapmak mümkün.:

preg_match('/^(?=.*word1)(?=.*word2)(?=.*word3)/i', $string)

Ancak, muhtemelen daha net ve sadece regex dışında bunu yapmak için belki daha hızlı:

preg_match('/word1/i', $string) && preg_match('/word2/i', $string) && preg_match('/word3/i', $string)

ya da, hedef dizeleri gibi basit olmadığını word1:

stripos($string, 'word1')!==FALSE && stripos($string, 'word2')!==FALSE && stripos($string, 'word3')!==FALSE

I and harf kullanarak bazı sorun neden olabilir sorunuza bir durum hakkında düşündüklerim:

Bu durum

words = "abcd","cdef","efgh"

dizesinde maç var:

string = "abcdefgh"

belki REG.EXP kullanarak olmamalı

Eğer şartlar görüneceği sırasını biliyorsanız, aşağıdaki gibi bir şey kullanabilirsiniz:

preg_match("/(word1).*(word2).*(word3)/i", $string);

Terimlerin sırası tanımlı değilse, muhtemelen en iyi 3 ayrı ifadeler kullanarak ve hepsi uyumlu olduğunu kontrol edilecektir. Tek bir ifadesi mümkün ama büyük olasılıkla karmaşık.

preg_match( "/word1.*word2.*word3)/i");

This works but they must appear in the stated order, you could of course alternate preg_match("/(word1.*word2.*word3|word1.*word3.*word2|word2.*word3.*word1| word2.*word1.*word3|word3.*word2.*word1|word3.*word1.*word2)/i");

Ama oldukça herendous ve deli olması gerekirdi şu!, Sadece bir döngü ya da birden fazla regex maçlarda strpos($haystack,$needle); kullanmak güzel olurdu.