Menu

PHP preg_match(): Örneklerle Düzenli İfadeler (Regex)

preg_match($pattern, $subject, $matches) bir dizgeyi bir düzenli ifadeyle test eder ve eşleşme için 1, eşleşme yoksa 0 döndürür. Yakalama gruplarını, adlandırılmış grupları, preg_match_all, çapaları, doğrulama kalıplarını ve UTF-8 ile Japonca metin için u değiştiricisini öğrenin.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA