preg_match($pattern, $subject, $matches) bir dizgenin bir düzenli ifadeyle eşleşip eşleşmediğini kontrol eder. Eşleşmede 1, aksi halde 0 döndürür ve $matches dizisini bulduklarıyla doldurur: preg_match('/\d+/', 'Order 4521 shipped', $m) 1 döndürür ve $m[0] değerini "4521" yapar.
Kalıp, etrafında ayraçlar (genellikle /.../) ve ardından i gibi değiştiriciler bulunan bir dizgedir. Kalıpları tek tırnak içinde yazın: çift tırnak içinde PHP önce $name ifadesini ve \x41 veya \101 gibi kaçışları açar, bu yüzden regex motoru yazdığınızdan farklı bir kalıp alabilir.
Yakalama grupları
Bir kalıptaki parantezler dizgenin eşleştikleri kısmını yakalar. $m[0] eşleşmenin tamamı, $m[1] ilk grup, $m[2] ikinci gruptur; soldan açılış parantezine göre sayılır.
Adlandırılmış gruplar
(?<name>...) bir gruba ad verir. Değer hem ad hem numara altında saklanır, böylece biri kalıbın daha önceki bir yerine grup eklediğinde sonucu okuyan kod bozulmaz.
preg_match_all ile her eşleşmeyi bulma
preg_match_all() ilk eşleşmeden sonra aramaya devam eder ve eşleşme sayısını döndürür. Varsayılan olarak $m[0] tüm tam eşleşmeleri, $m[1] ilk grubun tüm değerlerini tutar. PREG_SET_ORDER ile bunun yerine eşleşme başına bir dizi alırsınız; üzerinde dolaşmak daha kolaydır.
Girdi doğrulama: çapalar, telefon numaraları, posta kodları
Doğrulama için kalıp dizgenin tamamıyla eşleşmelidir, bu yüzden onu ^ ile başlatıp $ ile bitirin. Bir tuzak: $ sondaki bir yeni satırdan önce de eşleşir, bu yüzden '/^\d+$/' "123\n" değerini kabul eder. D değiştiricisini ekleyin ya da yalnızca en sonda eşleşen \z kullanın.
E-posta adresleri için bir regex ya geçerli adresleri reddeder ya da geçersizleri kabul eder. Bunun yerine filter_var($email, FILTER_VALIDATE_EMAIL) kullanın (bkz. filter_var()).
UTF-8 ve Japonca metin için u değiştiricisi
u değiştiricisi olmadan bir kalıp baytlar üzerinde çalışır. UTF-8'de bir Japonca karakter üç bayttır, bu yüzden . bir karakterin üçte biriyle eşleşir ve uzunluklar yanlış çıkar. u ile kalıp karakterler üzerinde çalışır ve Unicode özellik sınıflarını kullanabilirsiniz.
u konu dizgesini de doğrular: dizge geçerli UTF-8 değilse preg_match() eşleştirmek yerine false döndürür.
Kullanıcı girdisini preg_quote ile kaçışlama
., +, ?, ( ve / gibi karakterlerin bir kalıpta özel anlamları vardır. Kalıbın bir kısmı bir arama terimi gibi bir değişkenden geliyorsa onu ikinci argüman olarak ayraçla birlikte preg_quote() içinden geçirin, yoksa 1+1 11 ile eşleşir ve kaçışlanmamış bir / kalıbı bozar.
Geçersiz bir kalıp hata fırlatmaz. PHP bir uyarı yazdırır ve preg_match() false döndürür:
Warning: preg_match(): No ending delimiter '/' found in /path/to/index.php on line 3
Bu yüzden kalıp çalışma zamanında oluşturulduğunda === false (veya preg_last_error_msg()) kontrol edin. Hiç kalıp olmadan düz bir alt dizge kontrolü için str_contains() daha hızlı ve daha açıktır. Eşleşen metni değiştirmek için preg_replace() kullanın.
Sıkça Sorulan Sorular
PHP'de preg_match ne döndürür?
Kalıp eşleşirse 1, eşleşmezse 0, kalıbın kendisi geçersizse false. 0 ve false ikisi de falsy olduğu için başarısız bir kalıbı eşleşme olmamasından ayırmanız gerektiğinde === 1 ile karşılaştırın.
preg_match ile eşleşen metni nasıl alırım?
Üçüncü bir argüman verin: preg_match('/(\d+)/', 'Order 4521', $m). O zaman $m[0] eşleşmenin tamamı, $m[1] ilk yakalama grubudur; burada ikisi de "4521". Adlandırılmış bir (?<id>\d+) grubuyla değer $m['id'] içinde de olur.
preg_match ile preg_match_all arasındaki fark nedir?
preg_match() ilk eşleşmede durur. preg_match_all() her eşleşmeyi bulur, kaç tane bulduğunu döndürür ve $matches dizisini hepsiyle doldurur: preg_match_all('/\d+/', 'a1 b22 c333', $m) 3 döndürür ve $m[0] ["1", "22", "333"] olur.
preg_match'i Japonca veya diğer UTF-8 metinlerle nasıl kullanırım?
u değiştiricisini ekleyin: preg_match('/^.{3}$/u', '日本語') 1 döndürür. u olmadan PHP dizgeyi bayt olarak ele alır, bu yüzden . 3 baytlık bir karakterin bir baytıyla eşleşir. u ile \p{Han}, \p{Hiragana} ve \p{Katakana} gibi Unicode sınıflarını da kullanabilirsiniz.
PHP'de bir dizgenin yalnızca rakam içerip içermediğini nasıl kontrol ederim?
preg_match('/^\d+$/D', $s) ya da regex olmadan ctype_digit($s). D değiştiricisi (veya $ yerine \z) önemlidir: düz $ sondaki bir yeni satırı da kabul eder, bu yüzden "123\n" geçerdi.