Ev / Windows'a genel bakış / Dize numarasından düzenli Php. PHP regexp: düzenli ifade örnekleri. Normal ifade örnekleri

Dize numarasından düzenli Php. PHP regexp: düzenli ifade örnekleri. Normal ifade örnekleri

Düzenli ifadenin ne olduğuyla başlayalım. O halde bana şu soruyu cevapla: "test" kelimesinde "e" var mı? "Yemek yemek!" diyorsun. O zaman size ikinci bir soru soruyorum, "test" kelimesindeki "e" harfini nasıl buldunuz? Cevap belli, ilk karakter olan “t”yi alıp aradığımız şeyle yani “e” ile karşılaştırıyoruz. Eşit değillerse ikinci karakter olan “e”yi alıp aradığımız karakter olan “e” ile karşılaştırırız. İşte! Bir eşleşme bulundu. Cevap: "Test" kelimesi "e" harfini içerir.

Şimdi bana bir soru daha cevapla, bu örnekte düzenli ifade nerede? Umarım buradaki normal ifadenin "test" kelimesinde aradığımız şey olduğunu tahmin etmişsinizdir. Yani bu örnekteki "e" harfi bir düzenli ifadedir.

PHP'de düzenli ifadeler ne için kullanılır? Uygulamamda, örneğin bir adresin doğru şekilde oluşturulup oluşturulmadığını belirlemek için düzenli ifadeler kullanıldı. e-posta. Bu tür ifadeler aynı zamanda kullanıcı adı ve şifrenin doğruluğunu belirlemek için de kullanılır. Normal ifadeleri kullanarak adresi bir bağlantıda bulabilir ve kaydedebilirsiniz. Yapabileceğiniz birçok şey var. Bunu analiz ederek normal ifadelerin ana işlevini ve iki yan işlevini tanımlayabilirsiniz. Ana işlev , bu bir dizedeki eşleşmelerin aranmasıdır. Yan etkiler arasında bulunan eşleşmelerin kaydedilmesi ve değiştirilmesi yer alır.

İlk düzenli ifade

Teorik olarak “test” kelimesindeki “e” karakterini nasıl bulacağımızı anlıyoruz ama pratikte bu nasıl uygulanıyor? Php'de normal ifadeleri kullanmak için genellikle aşağıdaki işlevler kullanılır:

preg_match("normal ifade (örüntü)", "aramanın gerçekleştirildiği değişken", "Arama sonucunun kaydedildiği değişken (isteğe bağlı parametre)"); - Eşleştirme işlevi
preg_replace("normal ifade (örüntü)", "Bulunan eşleşme neyle değiştirilecek", "değiştirmenin yapılacağı değişken"); - İşlevi değiştir

Bu işlevleri kullanmaya başlayalım. Aşağıda "test" sözcüğünde "e" karakterini aramanın bir örneği verilmiştir:

$a = "test";
if(preg_match("/e/",$a)) echo "bulundu!!";

Kod durumu açıklar: $a değişkeninde kalıpla eşleşen bir şey bulunursa, "bulundu!!" mesajını görüntüleyin. Fark ettiğiniz gibi şablonumuz iki "/" arasında yer alıyor. İÇİNDE bu durumda sembol "/" desenimizin başlangıcını ve sonunu simgeliyor. Umarım bu açıktır.

Bütün bunlar elbette ilginç… ama şablonumuz çok basit, öyle değil mi? Sonuçta nadiren bir değişkende bir sembol bulmamız gerekir. Çoğu durumda, birçok karakterin yanı sıra bilinmeyen karakterleri de bulmamız gerekir. Bu nasıl olabilir? Kendimize bir sorun belirleyelim ve çözmeye çalışalım. Rakamlardan ve bilinmeyen bir İngilizce harften oluşan bir dizimiz olduğunu varsayalım.

Bu mektubu nasıl bulabilirim? İngiliz alfabesinde herhangi bir harf olabilir, peki onu nasıl tanımlayabilirsiniz? Sorunuzu kendiniz cevapladınız, herhangi bir harf var, yani a'dan z'ye kadar. Aralıkları normal ifadelerde kullanabilirsiniz. Hangi karakteri aradığımızı bilmiyorsak ancak bu karakterin İngiliz alfabesinin bir harfi olduğundan eminsek, giriş şu şekilde olacaktır:

$a = "123a321";
if(preg_match("//",$a)) echo "bulundu!!";

Aralığın "[" "]" parantezleri içine alındığını unutmayın. Bu tür parantezlerin içine alınan her şey şu şekilde tanımlanır: bir sembolü, bu durumda sembol a'dan z'ye kadar değişir. Bir harf değil bir sayı bulmamız gerekirse, giriş şöyle olacaktır:

$a = "abc1cba";
if(preg_match("//",$a)) echo "bulundu!!";

Ayrıca normal ifadelerin büyük/küçük harfe duyarlı olduğunu, dolayısıyla “A” ve “a” karakterlerinin tamamen farklı olduğunu da belirtmek isterim; her iki karakteri de aramak için şu şekilde yazın:

$a = "123a321";
if(preg_match("//",$a)) echo "bulundu!!";

İngilizce harflerle aynı şekilde gerçekleştirilen Rusça harfler için de bir arama var:

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "bulundu!!";

Metakarakterler

Bir dizide bilinmeyen bir karakteri nasıl arayacağımızı öğrendik. Birkaç karakter bulmamız gerekirse ne yapmalıyız? Sözde metasemboller imdadımıza yetişiyor... Diyelim ki elimizde rakam ve harflerden oluşan bir dizi var, bunu şablonda nasıl anlatabiliriz? Bunu yapabilirsiniz:

satır - 123a321
örnek -

Hmm... şablon aslında bizim dizemizle eşleşiyor ve uyumluluk açısından kontrol edildiğinde uzun zamandır beklenen gerçeği verecek! Ama bu biraz hantal bir kayıt, sence de öyle değil mi?

Bunu nasıl kısaltacağınız aşağıda açıklanmıştır:

satır - 123a321
örnek - *

Bana öyle geliyor ki daha kısa. “*” Sembolü nedir? Bu aynı metasemboldür, yani tanımladığımız sembolün (yani 0'dan 9'a kadar rakamları veya İngiliz alfabesinin a'dan z'ye harflerini içerebilen bir sembol) süresiz olarak veya birden fazla tekrarlanabileceği anlamına gelir. Evet evet! Bu metasembol boş bir değişkende bir eşleşme bulacaktır, çünkü tanımladığımız sembolün yokluğu bile doğru olacaktır! Bunu hatırla

Başka hangi meta karakterler var?

Örneğin, meta karakter "+" Küçük bir istisna dışında "*" meta karakterine neredeyse benzer. "*", hiçbir karakter olmasa bile true değerini döndürür ve "+", en az bir karakterin varlığını kontrol eder. Yani, eğer bir çizgi varlığı gerektiriyorsa minimum bir karakter sonra "*" yerine "+" kullanın

Meta karakter "?" de sıklıkla kullanılır. Bu, satırın birden fazla istenen karakter içermemesi gerektiği anlamına gelir. Son anlattığım iki meta karakter için birkaç örnek vereyim.

Kullanıcının şifresinin doğruluğunu kontrol etmemiz gerektiğini varsayalım. Kullanıcı şifresinin ne içermesi gerektiğini düşünelim mi? Öncelikle en az bir karakter olmalı. İkinci olarak, yalnızca İngiliz alfabesinin rakamlarını ve harflerini içermelidir, böylece normal ifade şu şekilde görünecektir:

$a = "qwerty12345";

Hangi karakterlere izin verdik? Her durumda ve sayıdaki İngilizce harfler. Şimdi şifre yerine boş bir satır bırakmayı deneyin.

$bir = "";
if(preg_match("/+/",$a)) echo "Şifre doğru";

“Şifre doğru” mesajını görmezsiniz. Neden? Çünkü "+" meta karakteri, dizede en az bir karakter olup olmadığını kontrol etti.

Şimdi biraz hile yapalım, ifademize bir bakalım, izin vermedik, peki içinde boşluk diyelim değil mi? şifrenin sonuna boşluk koyup çalıştır

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Şifre doğru";

Peki neden doğru şifreyle ilgili mesajımızı görüyoruz? Oldukça basit... Function preg_match(); ilk maçta kontrolünü durdurur. Yani “q” sembolü tanımladığımız kalıba uyuyor ve geri kalan her şey artık fonksiyon için önemli değil. Bunu nasıl düzelteceğiniz aşağıda açıklanmıştır:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Şifre doğru";

Bir ifadenin başına "^" ve sonuna "$" ekleyerek, işleve modelin neyle eşleşmesi gerektiğini söyleriz. Tümü astar. Bu kodu çalıştırırsanız, şifrenin sonunda geçersiz bir karakter (boşluk) olduğundan mesajı görmezsiniz.

Şimdi "+" meta karakterini "?" meta karakterine değiştirin. Ne olacağını düşünüyorsun? Doğrudur, şifre birden fazla karakter içerdiğinden şifrenin doğruluğuna dair bir mesaj olmayacaktır. Umarım bu sık kullanılan üç meta karakterin çalışmasını doğru bir şekilde açıklamışımdır.

Bazen "değil" daha iyidir

En azından şifrenin doğruluğunu kontrol etmeyi öğrendik ve bu iyi bir şey! Size bir dizedeki bir şeyi aramanın başka bir yolundan bahsedeyim. Diyelim ki bir dizede sayıların yokluğunu kontrol etmemiz gerekiyor. Bu nasıl yapılır? İşte satır:

(Hayat bal gibi görünmesin diye içine özellikle bu “-_+()” sembollerini ekledim...) Aşağıdaki ifadeyi formüle edebiliriz:

Ancak itiraf etmelisiniz ki, bir satırda hangi karakterlerin kullanıldığını her zaman bilemiyoruz, ancak içinde sayıların olmaması gerektiğini kesinlikle biliyoruz! Bu nedenle satırları atlayacak bir şablon yazmak daha mantıklı olacaktır. HAYIR sayılar ve içinde olanlar değil "Aman Tanrım, ne kadar anlaşılmaz sembol var!!!". Bu tür problemler için doğru şekilde oluşturulmuş bir ifadenin bir örneği:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Sayı yok!";

Bunu nasıl başardık? Sembolü girdik Ancak! başına yerleştirilen "^" ([^0-9]) harfi, yapmamalı umarım bu durum halledilmiştir

Pekala, yavaş yavaş toparlayalım... Açıklamalı iki örnek vereceğim; bu sırada arama sonucunu bir değişkene nasıl kaydedeceğimizi ve posta adresinin doğruluğunu nasıl kontrol edeceğimizi öğreneceğiz.

Gördüm ve kurtardım!

Blogum

$a = " Blogum";
preg_match("/ /", $a);

Normal ifademizde bir bağlantıya dahil edilebilecek tüm olası karakterleri tanımladık. İfademizdeki tırnak işaretlerine ve “/” karakterlerine de dikkat çekmek istiyorum. Başlarında ters eğik çizgi var, ne işe yarıyor? Gerçek şu ki, "/" ve alıntının kendisi özel karakterlerdir. Ve şablonun bunları sıradan semboller olarak algılaması için onları taramamız gerekiyor. Özel karakterlerin önüne ters eğik çizgi eklenerek ekran uyarlaması gerçekleştirilir. umarım açıktır

$a = " Blogum";
preg_match("/ /", $a, $b);

Buna göre, bulunan bağlantının saklanacağı $b değişkeni biçiminde ek bir parametre eklemek gerekir. Ayrıca arama sonucunun bir diziye yerleştirildiğini de bilmeniz gerekir. Bu nedenle $b değişkeni bir dizidir. Aradığımız bilgi indeks 1'in altındadır. Bu, arama sonucunun $b değişkeninde olduğu anlamına gelir. Sonucu ekranda gösterelim:

$a = " Blogum";
preg_match("/ /", $a, $b);
yankı $b;

Doğru adres başarının anahtarıdır!

Ve son olarak sorunun cevabı; e-posta doğru mu? Öncelikle adreslerde hangi karakterlere izin verildiğini bulmanız gerekiyor? Bildiğim kadarıyla izin verilen karakterler şunları içeriyor:

  • İngilizce harfler, rakamlar, “_”, “-” hmmmm her şey öyle görünüyor... Bundan devam edeceğiz.
  • Sonra "@" var
  • Daha sonra İngilizce harfler
  • Sonraki nokta
  • Ve yine İngilizce harfler...

Yani düzenli ifade şu şekilde olacaktır:

$a = " [e-posta korumalı]";
if(preg_match("/^+@+.+$/", $a)) echo "e-posta adresi doğru!";
else echo "e-posta adresi doğru YAZILMAMIŞ!";

Peki... Umarım bu tür kayıtlar artık sizi korkutmuyordur ve bunları oldukça anlayabilirsiniz.

Son olarak bir şey söylemek istiyorum. Makalenin hantal olduğu ortaya çıktı ve aynı zamanda olasılıkların yalnızca bir kısmını kapsıyordu. Bu cümleyi okuyorsanız, büyük olasılıkla sonuna kadar okudunuz, bunun için çok teşekkür ederim.

Cms blogu geliştirmeyle ilgili yazı dizisine gelince, serinin ilk bölümü Kapatıldığını ilan ediyorum! Yakın gelecekte yönetici panelini uygulamaya başlayacağız, bu nedenle "geçiş yapmayın". Sorularınız varsa yanıtlamaktan memnuniyet duyarım. Senin için en iyisi, sahip olduğum tek şey bu!

) Size bir sayfanın kaynak kodunun belirli parçalarını bulmak için normal ifadelerin kullanımına ilişkin bir örnek gösterdim. Şimdi bunları kendimiz yazmayı öğreneceğiz. Bu beceri, yazmanıza, metni gereksiz parçalardan temizlemenize, büyük hacimli metinlerde gerekli parçaları aramanıza vb. yardımcı olacaktır.

Bu konu oldukça karmaşık, ancak en çok kısaca değinmeye çalışacağım önemli noktalar. Ne kadar başarılı olacağımı bilmiyorum ama umarım ders faydalı olur.
Öyleyse, PHP'de düzenli ifadelerle çalışmak için çeşitli işlevler olduğu gerçeğiyle başlayalım, ancak en sık üçü kullanılır:

  • preg_replace - normal ifadeyle eşleşen metni arayın ve değiştirin;
  • preg_match - yalnızca normal bir arama;
  • preg_split - metni arayın ve bölün.

En azından önceki derslerde bunları kullandık. Daha doğrusu, preg_match yerine preg_match_all vardı, ancak bu aslında aynı şeydir, yalnızca ikincisi ilk bulgudan sonra aramayı kesintiye uğratmaz. Yani, eğer preg_match kullanırsak, tüm oluşumları değil, yalnızca ilkini bulacağız.

Hangi durumda hangi fonksiyonun kullanılacağını seçmek oldukça basittir. Değiştirmemiz gerekiyor - sayfa kodunun gereksiz kısımlarını kaldırmamız gerektiğinde olduğu gibi değiştirmeyi kullanırız, hatırladın mı?

$sayfa = preg_replace("/ ^]/i", "", $sayfa); $sayfa = preg_replace("/ ^]/i", "", $sayfa); $sayfa = str_replace("", "", $sayfa);

Fonksiyonun ilk parametresi ne aradığımızı belirleyen normal bir karakterdir. İkincisi ise onun yerine ne koyacağımızdır. Üçüncüsü - Nereye bakıyoruz? Bu nedenle, burada $page değişkenini aldık ve ona preg_replace fonksiyonunun sonucunu atadık; burada tüm input type=checkbox'ın yanı sıra açma ve kapama etiketlerini de aradık. Bunları " ile değiştirdiler, yani basitçe sildiler. Umarım burada her şey açıktır. İfadenin kendisini (fonksiyonun ilk parametresi) analiz etmeye biraz sonra geçeceğiz.
Ayrıca kalan metindeki tüm bağlantıları bulmak için yararlı olan preg_match_all kullanımına ilişkin bir örnek de vardı. O zaman bağlantılara ihtiyacımız vardı çünkü bunlar ayrıştırdığımız anahtar kelimeleri içeriyordu. İşte olanlar:

Preg_match_all("/ ]+?>(.*?)<\/a>/uis",$sayfa,$tamam); for ($j=0; $j ".$tamam[$j].""; }

İlk parametre, doğal olarak "a" etiketinin içine alınan tüm bağlantıları bulmak için yine normal bir ifadedir (html işaretlemesine aşina değilseniz, okuyun). İkincisi ise aranacak metni içeren değişkendir. Üçüncü parametre, sonucun yerleştirildiği değişkendir - $ok. Bundan sonra geriye kalan tek şey, ihtiyacımız olan anahtar yakalamaları elde etmek için $ok'un gerekli tüm öğelerini gözden geçirmektir. Ayrı olarak, çıktıda çok boyutlu bir dizi elde ettiğimiz söylenmelidir. Bu yüzden onu bu kadar karmaşık bir şekilde gösterdik: $ok[$j]. Dizinin yapısını görüntülemek için aşağıdaki fonksiyonu kullanın, her şeyi anlayacaksınız.

Print_r($tamam);

Görünüşe göre işimiz için kullandığımız fonksiyonları sıraladık. Şimdi geriye kalan tek şey, bu yöntemlerin her birinin ilk parametresi olan aynı düzenli ifadelerin nasıl yazılacağını öğrenmek. Gelelim en önemli şeye.

Normal cümleler nasıl yazılır?

Öncelikle temel yapılara bakalım. İfadelerin seçenekleri vardır. Bir harfle belirtilirler ve sonuna eğik çizgi gelecek şekilde yazılırlar.

Ayrıca aşağıdaki meta karakterler desteklenir:

Metakarakterlerin de değiştiricileri olabilir:

Artık son dersteki düzenli kalıplarımızı analiz etmeye geçebiliriz. Yukarıdaki işaretlere dayanarak elimizde ne olduğunu anlamaya çalışalım. İşte ifade:

/^]/i

İlk ve son eğik çizgiler “/” içlerinde düzenli ifade bulunduğunu gösterir. Aynı zamanda, “i” koyduğumuz sonuncudan sonra, bu, ilk tabloda olduğu gibi bir seçenektir - büyük/küçük harf dikkate alınmaz. Eğik çizgilerin içinde normal dizinin kendisi bulunur. Küçüktür işareti ve giriş etiketiyle başlar ve bundan sonra nokta işaretine kadar gelen her şey aranacak düz metindir. Ancak noktanın kendisi ve sonrasındaki semboller daha ilgi çekicidir. Bu durumda yapı “.*?” herhangi bir karakter dizisi anlamına gelir. Yani, eğer sadece metni ve bu yapıyı birleştirirsek, o zaman metnin tamamını ilk geçtiği andan itibaren ve sonuna kadar seçeceğiz. Durdurmak için ya bir kapanış HTML “daha ​​fazlası” etiketiyle ya da yeni bir satır karakteriyle karşılaşmanız gerekir. Bu tasarım bize tam da böyle bir fırsat sunuyor:

Köşeli parantez içindeki karakterler mantıksal VEYA ile bağlanır. Son, büyüktür işareti VEYA satırın başlangıcıdır.
İfadenin tamamı bu kadar, içinde başlangıç ​​koşulunu, orta ve bitiş koşulunu belirledik. Zor değil, değil mi? Açıklık sağlamak için burada bir örnek verilmiştir:

Her şeyi sağlamlaştırmak için bir şeye daha bakalım. Onlarla bağlantılar aradık:

/]+?>(.*?)<\/a>/uis

İfadeyi okuduk. Yine ilk önce eğik çizgileri ve seçenekleri atıyoruz. "Uis" bayrakları, açıklamadığım "u" dışında, kendi kendini açıklamaktadır; bu, Unicode kodlamasını kullandığımızı gösterir. Fazla bir şey kalmadı. Başlangıç, açılan "a" etiketidir, ardından sınıf gelir

bu, (HTML etiketlerini açma ve kapatma), yani bu durumda herhangi bir karakterden büyük veya küçük DEĞİLDİR anlamına gelir. Sınıfa “+?” eklenir, bu da bu sınıfın 1 veya daha fazla kez (ancak en az 1 kez) bulunacağı anlamına gelir. Daha sonra “a” etiketinin kapanış html etiketi geliyor. Bağlantının içinde grup tarafından belirtilen bir metin var

Sonuçta orada ne tür bir metin olacağını bilmiyoruz, dolayısıyla böyle bir grup tanımlıyoruz. Ve sonunda bir “a” kapanış etiketi var:

Basit metin olarak algılanması için eğik çizgiden ters eğik çizgi kullanarak kaçındığımızı lütfen unutmayın.

Vay be. Konu gerçekten oldukça karmaşık, pratik gerektiriyor. Belki pek optimal olmayan bir şey yapıyorum ve başka, daha doğru düzenli ifadeler oluşturmak mümkün, ancak ben de sizin kadar kendi kendimi yetiştirdim, bu yüzden katı bir şekilde yargılamayın, bunun yerine seçeneklerinizi yorumlarda paylaşın. Ayrıca anlaşılmayan bir nokta olursa yorum ve iletişim sayfası hizmetinizdedir.

Herhangi bir modern programlama dilinde metinlerle çalışırken, geliştiriciler sürekli olarak girilen verilerin istenen kalıba uygunluk açısından kontrol edilmesi, test parçalarının aranması ve değiştirilmesi ve sembolik bilgilerin işlenmesine yönelik diğer tipik işlemlerle karşı karşıya kalır. Kendi doğrulama algoritmalarınızı geliştirmek, zaman kaybına, program kodunun uyumsuzluğuna ve geliştirilmesinde ve modernizasyonunda karmaşıklığa yol açar.

İnternet ve WEB geliştirme dillerinin hızlı gelişimi, metin bilgilerinin işlenmesi için gerekli minimum miktarda kodla evrensel ve kompakt araçların oluşturulmasını gerektirdi. Yeni başlayanlar ve profesyonel geliştiriciler arasında popüler olan PHP dili de bir istisna değildir. Bir metin şablonu dili olarak normal ifade, metin işleme görevlerini basitleştirmenize ve program kodunu onlarca ve yüzlerce satır azaltmanıza olanak tanır. Pek çok sorun onsuz çözülemez.

PHP'de düzenli ifadeler

PHP dili düzenli ifadelerle çalışmak için üç mekanizma içerir - “ereg”, “mb_ereg” ve “preg”. En yaygın olanı, işlevleri orijinal olarak Perl dili için geliştirilen ve PHP'ye dahil olan PCRE düzenli ifade kitaplığına erişim sağlayan "preg" arayüzüdür. Preg işlevleri, normal ifade dilinde belirli bir kalıba göre belirli bir metin dizesinde eşleşme arar.

Sözdizimi Temelleri

Kısa bir makalede düzenli ifadelerin tüm sözdizimini ayrıntılı olarak anlatmak imkansızdır; bunun için özel literatür vardır. Geliştiriciye geniş olanakları göstermek ve kod örneklerini anlamak için yalnızca ana unsurları sunuyoruz.

B resmi olarak çok karmaşık bir şekilde tanımlanmıştır, o yüzden açıklamayı basitleştirelim. Düzenli ifade bir metin dizesidir. Sınırlandırılmış bir model ve bunun nasıl işleneceğini gösteren bir değiştiriciden oluşur. Şablonlarda çeşitli alternatiflere ve tekrarlara yer vermek mümkündür.

Örneğin, ifadede /\d(3)-\d(2)-\d(2)/m ayırıcı olacak «/» , ardından desen ve sembol gelir "M" değiştirici olacaktır.

Düzenli ifadelerin tüm gücü meta karakterler kullanılarak kodlanır. Dilin ana meta karakteri ters eğik çizgidir - “\”. Kendisini takip eden karakterin türünü tersine çevirir (yani normal bir karakter meta karakter haline gelir ve bunun tersi de geçerlidir). Bir diğer önemli meta karakter, modelin alternatif varyasyonlarını belirten eğik çizgi "|"dir. Daha fazla meta karakter örneği:

PHP, normal ifadeleri işlerken boşluğu ayrı bir önemli karakter olarak ele alır, dolayısıyla ABCWHERE ve ABCWHERE ifadeleri farklıdır.

Alt modeller

PHP'de normal alt kalıplar parantezlerle ayrılır ve bazen "alt ifadeler" olarak adlandırılır. Aşağıdaki işlevleri gerçekleştirin:

    Alternatifleri Vurgulama. Örneğin şablon ısı(bir şey|kuş|) kelimelerle eşleşiyor "ısı", "ateş kuşu" Ve "haşlamak". Ve parantezler olmadan sadece boş bir dize olurdu: "kuş" ve "kızartma".

    "Heyecan verici" alt desen. Bu, kalıpta bir alt dize eşleşirse tüm eşleşmelerin sonuç olarak döndürüleceği anlamına gelir. Açıklık sağlamak için bir örnek verelim. Aşağıdaki düzenli ifade göz önüne alındığında: kazanan alır((altın|yaldızlı)(madalya|kupa)) - ve eşleşmeleri bulmak için bir satır: "Kazanan altın madalya alır". Orijinal ifadeye ek olarak, arama sonucu şunu döndürecektir: "altın madalya", "madalya", "altın".

Tekrarlama operatörleri (quadriifiers)

Düzenli ifadeler yazarken genellikle sayıların ve simgelerin tekrarlarını analiz etmek gerekir. Çok fazla tekrar yoksa bu bir sorun değildir. Peki tam sayısını bilmediğimizde ne yapmalıyız? Bu durumda özel meta karakterler kullanmanız gerekir.

Tekrarları tanımlamak için dörtleyiciler (miktarı belirtmek için meta semboller) kullanılır. Quadrifier'lar iki tiptir:

  • genel, parantez içine alınmış;
  • kısaltılmış.

Genel nicelik belirteci, bir öğenin izin verilen minimum ve maksimum tekrar sayısını süslü parantez içindeki iki sayı olarak ifade ederek şöyle belirtir: x(2,5). Maksimum tekrar sayısı bilinmiyorsa ikinci argüman atlanır: x(2,).

Kısa niceleyiciler, gereksiz sözdizimi karmaşasını önlemek için en yaygın tekrarlara ilişkin sembolleri temsil eder. Yaygın olarak üç kısaltma kullanılır:

1. * - (0,)'a eşdeğer olan sıfır veya daha fazla tekrar.

2. + - bir veya daha fazla tekrar, yani ,).

3.? - sıfır veya yalnızca bir tekrar - (0,1).

Normal ifade örnekleri

Düzenli ifadeleri öğrenenler için örnekler en iyi öğreticidir. Minimum çabayla geniş yeteneklerini gösteren birkaç tanesini sunacağız. Tüm program kodları PHP 4.x ve üzeri sürümlerle tamamen uyumludur. Sözdizimini tam olarak anlamak ve dilin tüm özelliklerini kullanmak için, J. Friedl'in sözdizimini tam olarak tartışan ve yalnızca PHP'de değil, aynı zamanda Python, Perl, MySQL için de düzenli ifade örnekleri içeren “Normal İfadeler” kitabını öneriyoruz. Java, Ruby ve C#.

E-posta adresinin doğruluğunun kontrol edilmesi

Görev. Ziyaretçiden e-posta adresi isteyen bir internet sayfası bulunmaktadır. Normal ifade, mesaj göndermeden önce alınan adresin doğru olup olmadığını kontrol etmelidir. Kontrol, belirtilen posta kutusunun gerçekten mevcut olduğunu ve mektupları kabul ettiğini garanti etmez. Ancak açıkça yanlış adresleri ayıklayabilir.

Çözüm. Herhangi bir programlama dilinde olduğu gibi, PHP e-posta adresi doğrulama normal ifadeleri çeşitli şekillerde uygulanabilir ve bu makaledeki örnekler her şeyin başı ve sonu değildir. Bu nedenle, her durumda programlama sırasında dikkate alınması gereken gereksinimlerin bir listesini sunacağız ve spesifik uygulama tamamen geliştiriciye bağlıdır.

Dolayısıyla bir e-postanın geçerli olup olmadığını kontrol eden bir ifadenin aşağıdaki koşulları kontrol etmesi gerekir:

  1. Kaynak dizede @ sembolünün varlığı ve boşlukların bulunmaması.
  2. Adresin alan adı kısmı ve ardından @ simgesi gelir, yalnızca alan adları için geçerli karakterler içerir. Aynı durum kullanıcı adı için de geçerlidir.
  3. Bir kullanıcı adını kontrol ederken kesme işareti veya gibi özel karakterleri aramanız gerekir. Bu karakterler potansiyel olarak tehlikelidir ve SQL enjeksiyonu gibi saldırılarda kullanılabilir. Bu tür adreslerden kaçının.
  4. Kullanıcı adları yalnızca bir noktaya izin verir; bu, satırdaki ilk veya son karakter olamaz.
  5. Alan adı en az iki, en fazla altı karakterden oluşmalıdır.

Tüm bu koşulları dikkate alan bir örneği aşağıdaki şekilde görebilirsiniz.

URL'lerin geçerliliğini kontrol etme

Görev. Belirli bir metin dizesinin geçerli olup olmadığını kontrol edin Bir kez daha, URL denetiminin düzenli ifadeleri çeşitli şekillerde uygulanabileceğini unutmayın.

Çözüm. Son versiyonumuz şöyle görünüyor:

/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

Şimdi şekli kullanarak bileşenlerine daha detaylı bakalım.

Kredi kartı numaralarını kontrol etme

Görev. En yaygın ödeme sistemleri için girilen plastik kart numarasının doğruluğunun kontrol edilmesi gerekmektedir. Seçenek yalnızca kartlar için dikkate alınır

Çözüm. Bir ifade oluştururken girilen sayıdaki olası boşluk varlığını dikkate almalısınız. Karttaki sayılar okumayı ve dikte etmeyi kolaylaştırmak için gruplara ayrılmıştır. Bu nedenle bir kişinin sayıyı bu şekilde (yani boşluk kullanarak) girmeye çalışması oldukça doğaldır.

Olası boşlukları ve kısa çizgileri hesaba katan evrensel bir ifade yazmak, sayılar dışındaki tüm karakterleri atmaktan daha zordur. Bu nedenle ifadede sayılar dışındaki tüm karakterleri kaldıran /D meta karakterinin kullanılması önerilir.

Artık doğrudan numarayı kontrol etmeye devam edebilirsiniz. Tüm kredi kartı şirketleri benzersiz bir sayı biçimi kullanır. Örnek bunu kullanıyor ve müşterinin şirket adını girmesine gerek yok; numaraya göre belirlenir. Visa kartları her zaman 4 ile başlar ve 13 veya 16 haneli bir sayı uzunluğuna sahiptir. MasterCard 51-55 aralığında 16 sayı uzunluğuyla başlar. Sonuç olarak aşağıdaki ifadeyi elde ederiz:

Bir siparişi işleme koymadan önce, Luhn algoritması kullanılarak hesaplanan numaranın son basamağını ek olarak kontrol edebilirsiniz.

Telefon numaralarını kontrol etme

Görev. Girilen telefon numarasının doğruluğu kontrol ediliyor.

Çözüm. Sabit hat ve cep telefonu numaralarındaki rakam sayısı ülkeden ülkeye önemli ölçüde farklılık gösterdiğinden, normal ifadeler kullanarak bir telefon numarasının doğruluğunun evrensel olarak kontrol edilmesi mümkün değildir. Ancak uluslararası numaraların katı bir formatı vardır ve şablon kontrolü için mükemmeldir. Üstelik giderek daha fazla ulusal telefon operatörü tek bir standarda uymaya çalışıyor. Sayının yapısı aşağıdaki gibidir:

+CCC.NNNNNNNNNNxEEEE, Nerede:

C, 1-3 rakamdan oluşan ülke kodudur.

N - 14 basamağa kadar uzunlukta sayı.

E - isteğe bağlı uzantı.

Artı gerekli bir öğedir ve x işareti yalnızca genişletme gerektiğinde mevcuttur.

Sonuç olarak aşağıdaki ifadeye sahibiz:

^\+(1,3)\.(4,14)(?:x.+)?$

Aralıktaki sayılar

Görev. Belirli bir aralıktaki bir tamsayıyla eşleşmelisiniz. Ayrıca normal ifadelerin yalnızca bir değer aralığındaki sayılarla eşleşmesi gerekir.

Çözüm. En yaygın durumlardan birkaçına ilişkin bazı ifadeleri burada bulabilirsiniz:

IP Adresi Bulma

Görev. Verilen dizenin 000.000.000.000-255.255.255.255 aralığında IPv4 formatında geçerli bir IP adresi olup olmadığını belirlemelisiniz.

Çözüm. PHP'deki herhangi bir görevde olduğu gibi, düzenli ifadelerin de birçok çeşidi vardır. Örneğin, bu:

Çevrimiçi ifade kontrolü

"Normal" programlama dillerinden farklı olan sözdiziminin karmaşıklığı nedeniyle, düzenli ifadelerin doğruluğunu test etmek yeni programcılar için zor olabilir. Bu sorunu çözmek için, oluşturulan şablonun gerçek metin üzerinde doğruluğunu kontrol etmeyi kolaylaştıran birçok çevrimiçi ifade test aracı vardır. Programcı test edilecek ifadeyi ve veriyi girer ve anında işleme sonucunu görür. Genellikle en yaygın programlama dilleri için düzenli ifadelerin, örneklerin ve uygulama farklılıklarının ayrıntılı olarak anlatıldığı bir referans bölümü de bulunur.

Ancak PHP kullanan tüm geliştiricilerin çevrimiçi hizmetlerin sonuçlarına tamamen güvenmesi önerilmez. Kişisel olarak yazılan ve test edilen düzenli bir ifade, becerilerinizi geliştirir ve hata olmamasını garanti eder.


PHP dilinin en güçlü ve kullanışlı özelliklerinden biri düzenli ifadeleri desteklemesidir. Hem yeni başlayanlar hem de oldukça deneyimli olan birçok programcı, düzenli ifade dilinin görünürdeki karmaşıklığı ve karmaşıklığı nedeniyle korkutulur. Ama sizi temin ederim ki buna değer. Düzenli ifadelerin kullanılması, metinlerin ve zayıf yapılandırılmış verilerin işlenmesi işini büyük ölçüde basitleştirir.


Düzenli ifadeler özel bir dilde yazılan ifadelerdir. Endişelenmeyin, dilin anlaşılması oldukça kolaydır; ihtiyacınız olan tek şey deneyim ve pratiktir.


Sanırım metniniz olduğunda (örneğin, Microsoft Word'de) ve içinde önemli bir şey bulmanız gereken durumlarla defalarca karşılaştınız. Tam olarak ne aradığınızı biliyorsanız, her şey basittir: arama iletişim kutusunu açın, arama kelimesini girin, düğmeye basın ve işte - metin bulundu.


Ancak yalnızca aradığınız bilgi türünü önceden biliyorsanız ne yapacaksınız? Örneğin, birkaç yüz sayfalık bir belgedeki tüm e-posta adreslerini bulma göreviyle karşı karşıyasınız. Bazıları belgeyi manuel olarak görüntüleyecek, bazıları aramaya köpeği (@) girip onu arayacak. Katılıyorum - her iki seçenek de yıpratıcı, nankör bir iştir.

Düzenli ifadelerin kurtarmaya geldiği yer burasıdır. Bir miktar yaklaşımla, düzenli ifadeler metin üzerine bindirilen maskeler veya şablonlarla karşılaştırılabilir: eğer metin maskeyle eşleşiyorsa, o zaman bu istenen parçadır. Ancak düzenli ifadelerin kullanımını düşünmeden önce onların sözdizimine aşina olacağız.

Düzenli ifade, belirli yasa ve kurallara göre oluşturulmuş bir metin dizesidir. Bir dize, karakterlerden ve karakter gruplarından, meta karakterlerden, niceleyicilerden ve değiştiricilerden oluşur.

Bu durumda semboller herhangi bir alfabenin herhangi bir sembolü anlamına gelir. Ve sadece okunabilir olanlar değil. Bir ifadeye kolayca okunamayan bir karakter ekleyebilirsiniz; bunu yapmak için yalnızca onaltılık biçimdeki kodunu bilmeniz gerekir. Örneğin:

// okunabilir karakterler a E // okunamayan karakterler ve kodlar \x41 - "A" harfiyle aynı \x09 - sekme karakteri

Bir karakter grubu sırayla yazılan birkaç karakterden oluşur:

Abvg ACZm'ler

Hemen dikkatinizi çekmek isterim; düzenli ifadelerde “boşluk” da önemli bir karakter olarak kabul edilir, bu nedenle ifadeleri yazarken dikkatli olun. Örneğin, bu karakter grupları FARKLI ifadelerdir:

ABC NEREDE ABC NEREDE

Dilin bir sonraki öğesi meta karakterlerdir. "Meta" öneki, bu sembollerin başka bazı sembolleri veya gruplarını tanımladığı anlamına gelir. Tabloda normal ifade dilinin ana meta karakterleri açıklanmaktadır:

Özel karakterleri belirtmek için meta karakterler
() Parantez. İç içe geçmiş ifadeleri tanımlar.
| Seçim meta karakteri
^ Satır meta karakterinin başlangıcı
$ Satır sonu meta karakteri
\N Satır besleme karakteri (onaltılık kod 0x0A)
\R Satırbaşı karakteri (onaltılık kod 0x0D)
\T Sekme karakteri (onaltılık kod 0x09)
\xhhh Onaltılık kod 0xhh olan bir karakter eklenirse, örneğin \x42 Latin harfi "B" eklenecektir
Karakter gruplarını belirtmek için meta karakterler
. Nokta. Herhangi bir karakter.
\D Hane (0-9)
\D Sayı değil (0-9 karakterleri dışında herhangi bir karakter)
\S Boş karakter (genellikle boşluk ve sekme)
\S Boş olmayan karakter (\s meta karakteriyle tanımlanan karakterler hariç tümü)
\w Bir "sözlük" karakteri (kelimelerde kullanılan bir karakter. Genellikle tüm harfler, tüm sayılar ve bir alt çizgi ("_"))
\W \w meta karakteriyle tanımlanan karakterler dışındaki tüm karakterler

Tablonun ikinci yarısındaki meta karakterlerin hatırlanması çok kolaydır. "d" - rakam (rakam), "s" - sembol (sembol), "w" - kelime (kelime). Harf büyükse grup açıklamasına "DEĞİL" eklemeniz gerekir.

Örneğin “Kırmızı formanın numarası 1812, yeşil formanın numarası 2009” metnini ele alalım. En basit düzenli ifadelerin örneklerine bakalım:

\d\d\d\d - 1812 ve 2009'u bulacaktır \D - tüm harfleri, boşlukları ve noktalama işaretlerini bulacaktır \s - metindeki tüm boşlukları bulacaktır.

Ancak örneğimizdeki yıl dört değil iki rakamla yazılabilir, kelimelerin başka çekimleri olabilir, vb. Köşeli parantez kullanılarak belirtilen karakterlerin alt kümeleri burada yardımcı olabilir:

Herhangi bir rakam anlamına gelir (\d ile aynı) - çift rakam anlamına gelir - Latin alfabesinin herhangi bir sembolü (her durumda) veya rakam anlamına gelir.

Örneğin, test dizesindeki \d\d\d ifadesi yalnızca 1812'yi bulacaktır, ancak 2009'u bulamayacaktır. Bu ifade, "son rakamı 0,2,4,6 veya 0,2,4,6 olan dört basamaklı tüm dizileri bul" şeklinde okunmalıdır. 8".

Bahsetmemiz gereken tek şey niceleyiciler ve değiştiricilerdir.

Niceleyici bir karakterin veya karakter grubunun kaç kez görünmesi gerektiğini belirleyen özel bir yapıdır. Nicelik belirteci küme parantezleri "()" içinde yazılmıştır. İki kayıt formatı mümkündür: hassas ve aralık. Kesin format şu şekilde yazılmıştır:

Burada X, önceki sembolün veya grubun tekrarlanması gereken sayıdır. Örneğin ifade

İkinci kayıt şekli aralıktır. Olarak kaydedildi

(X, Y) // veya (,Y) // veya (X,)

burada X minimum ve Y maksimum tekrar sayısıdır. Örneğin:

"sırayla yazılmış iki ila dört rakam" olarak okunur. Sınırlardan biri belirtilmezse sınırlama olmadığı varsayılır. Örneğin:

\w(3,) - üç veya daha fazla harf. \d(,5) - hiç sayı yok veya var ama beşten fazla değil.

Niceleyiciler tek bir karaktere veya bir gruba uygulanabilir:

[A-Yaa-ya](1,3)

Bu yapı, bir, iki veya üç harfli tüm Rusça kelimeleri metinden seçecektir (örneğin, "veya", "değil", "ben", "gidiyorum" vb.).

Kıvrımlı parantezlerin yanı sıra üç niceleyici meta karakter daha vardır: “*” (yıldız), “+” (artı) ve “?” (soru). Gerekli minimum ve maksimum tekrar sayısının önceden bilinmediği durumlarda kullanılırlar. Örneğin, e-posta adreslerini ararken, kullanıcı adında kaç karakter olacağını ("köpek"ten önce) ve alan adında kaç karakter olacağını ("köpek"ten sonra) önceden söyleyemezsiniz.

"*" meta karakteri "sıfırdan veya daha fazlasından herhangi bir miktar" olarak okunur, yani. tasarım

tam yoklukları da dahil olmak üzere herhangi bir sayıda ardışık harfi tanımlar.

"+" sembolü yıldız işaretinden yalnızca en az bir karakterin varlığını gerektirmesi açısından farklılık gösterir. Onlar. tasarım

herhangi bir dijital diziyi bir veya daha fazla rakamla eşleştirir.

Sembol "?" tek bir karakterin yokluğu veya varlığıyla eşleşir. Onlar. tasarım

bir veya iki rakamlı herhangi bir dijital diziyi eşleştirir.

Burada “*” ve “+” karşıtlayıcılarının böyle bir özelliğinden bahsetmeye değer. açgözlülük. Buradaki önemli nokta, varsayılan olarak bu karakterlerin mümkün olan en uzun karakter dizisine karşılık gelmesidir. Örneğin “anne çerçeveyi yıkadı” satırı için şu ifade:

"mama sabunu ra"yı seçeceğiz ki bu biraz beklenmedik bir durum çünkü "ma" almayı bekliyorduk. Bu davranışı değiştirmek için "?" meta karakterini kullanın. (soru işareti) niceleyiciden hemen sonra yazılır. Niceleyicilerin "iştahını", onları en uzun eşleşme yerine ilk eşleşmeyi geri getirmeye zorlayarak sınırlandırır. Şimdi önceki örneği değiştirelim:

ve gerekli "ma" eşleşmesini elde edin.

Dilin son unsuru değiştiriciler. Değiştirici, düzenli ifadeleri analiz etmek için "sistem" parametrelerini tanımlayan özel bir karakterdir. Bu tür yalnızca dört sembol vardır; bunlar tek tek veya aynı anda kullanılabilir:

Ben Büyük/küçük harfe duyarlı olmayan modu etkinleştirir; İfadedeki büyük ve küçük harfler farklılık göstermez.
M Aranan metnin birden fazla satırdan oluşuyormuş gibi değerlendirilmesi gerektiğini belirtir. Varsayılan olarak, normal ifade motoru, gerçekte ne olduğuna bakılmaksızın metni tek bir dize olarak ele alır. Buna göre "^" ve "$" meta karakterleri tüm metnin başlangıcını ve sonunu belirtir. Bu değiştirici belirtilirse, sırasıyla metnin her satırının başlangıcını ve sonunu göstereceklerdir.
S Varsayılan meta karakter "."'dir. tanımına yeni satır karakterini dahil etmez. Onlar. çok satırlı metin için /.+/ ifadesi, beklendiği gibi metnin tamamını değil yalnızca ilk satırı döndürür. Bu değiştiricinin belirtilmesi bu sınırlamayı ortadan kaldırır.
sen Tüm niceliksel meta karakterleri varsayılan olarak "açgözlü değil" yapar. Dilin bazı modifikasyonlarında (özellikle PHP'de), "U" yerine, anlamıyla daha tutarlı olan "g" karakteri kullanılır ("g", İngilizce "açgözlü", "açgözlü" kelimelerinin kısaltmasıdır). ).

Tablo, düzenli ifadelerin en popüler ve gerekli örneklerini göstermektedir. Bazıları size karmaşık ve hantal görünebilir, ancak detaylı bir çalışmayla şüphesiz anlayacaksınız.

PHP'de düzenli ifadeler.

PHP'de normal ifadelerle çalışmak için özel işlevler vardır; bunların listesi ve kısa bir açıklaması tabloda verilmiştir:

int preg_match (dize modeli, dize konusu [, dizi eşleşmeleri])

İşlev, konunun içeriğinin desen deseniyle eşleşip eşleşmediğini kontrol eder. Eşleşme bulunursa 1 değerini döndürür, aksi takdirde 0 değerini döndürür. İsteğe bağlı eşleşme dizisi parametresini belirtirseniz, işlev yürütüldüğünde, içine tek bir öğe girilecektir - bulunan ilk eşleşme.

"; print_r($bulundu); ?>

int preg_match_all (dize modeli, dize konusu, dizi eşleşmeleri [, int sırası])
İşlev öncekiyle aynıdır, tek farkla tüm metni arar ve eşleşmeler dizisinde bulunan TÜM eşleşmeleri döndürür.
karışık preg_replace (karışık model, karışık değiştirme, karışık konu [, int limit])
Önceki her iki işlev gibi preg_replace de bir kalıpla eşleşen bir metin parçasını arar. İşlev, bulunan tüm parçaları parametrelerde belirtilen metinle değiştirir.Temizlemeden önce:\n$metin\n\n"; $metin = preg_replace("/(\n \s(2,))/"," ",$metin); echo " Temizledikten sonra:\n$metin"; // özel karakterlerden ve fazladan boşluklardan arındırılmış metni gösterecek //?>
karışık preg_replace_callback (karışık model, karışık geri arama, karışık konu [, int limit])
İşlev, öncekinin genişletilmiş bir sürümüdür. Temel fark, bu işlevin, metni analiz edecek ve yeni metin oluşturacak işlevin adını parametrelere iletmesidir.
dizi preg_split (dize modeli, dize konusu [, int limit [, int bayrakları]])
Bu işlev, patlayıcı() ve split() işlevlerine benzer. Özelliği, ayırıcının sabit bir dize değil, düzenli bir ifade olmasıdır. İşlev, kaynak verilerini öğelere böler ve bunları çıktı dizisine yerleştirir.
dizi preg_grep (dize deseni, dizi girişi)
İşlev, dizilerde düzenli arama yapmak için tasarlanmıştır. Arama için bir şablon ve girdi verileri dizisi belirtilir ve yalnızca şablonla eşleşen öğelerden oluşan bir dizi döndürülür.

Dikkate alınan işlevlerin listesi tam olmaktan uzaktır, ancak düzenli ifadelerle çalışmaya başarılı bir başlangıç ​​için oldukça yeterlidir. Bu konuyla ilgileniyorsanız, ek literatürü okuduğunuzdan emin olun (örneğin, Friedl’in “Düzenli İfadeler” kitabı). Ek olarak, eğitim amacıyla, normal ifadeleri test etmek için özel programlardan birini (örneğin, "PCRE" veya "RegEx Builder") kurmanızı öneririm.

1,6K

Normal İfadeler (regex olarak kısaltılır) arama modellerini oluşturan karakter dizileridir. Öncelikle dize eşleştirme modellerinde kullanılırlar.

Kısa tarih

  • Her şey 1940'lardan 1960'lara kadar birçok akıllı insanın düzenli ifadelerden bahsettiği dönemde başladı;
  • 1970'ler g/re/p;
  • 1980 Perl ve Henry Spencer;
  • 1997 PCRE (Perl Uyumlu Düzenli İfadeler). Bu, düzenli ifadeler dediğimiz şeyin yükselişinin başladığı zamandır. PCRE hemen hemen her dil için kütüphaneler sağlar.

PHP'de düzenli ifadelerin genel kullanımı

PHP, PCRE ile çalışmak için üç ana işlev içerir: preg_match, preg_match_all ve preg_replace.

Uyumluluk Karşılaştırması

İfade, eşleşme yapılırsa 1, eşleşmezse 0 ve bir hata oluşursa false değerini döndürür:

int preg_match (string $desen, string $konu [, array &$eşleşmeler [, int $bayraklar = 0 [, int $offset = 0 ]]])

Bulunan eşleşme sayısını döndüren normal ifade örneği:

int preg_match_all (string $örüntü, string $konu [, dizi &$eşleşmeler [, int $bayraklar = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Yenisiyle değiştirme

İfade, değiştirilen dizeyi veya diziyi döndürür ( $konuya dayalı):

karışık preg_replace (karışık $kalıp, karışık $değiştirme, karışık $konu [, int $limit = -1 [, int $sayısı ]])

JavaScript'te Normal İfadelerin Genel Kullanımı

JavaScript'teki normal ifadeler PHP'dekilerle hemen hemen aynı görünür.

Uyumluluk Karşılaştırması

Bir eşleşme dizisini döndürür veya hiçbir eşleşme bulunmazsa null değerini döndürür:

string.match(RegExp);

Yenisiyle değiştirme

Yapılan değişikliklerle birlikte bir dize döndüren normal ifade:

string.replace(RegExp, değiştirme);

JavaScript'te düzenli ifadelerin özellikleri

  • Bir nokta hiçbir zaman yeni satırla eşleşmez:
  • Eşleşmeyi ve değiştirmeyi normal ifadeyle karşılaştırmak için bunlar olmadan kullanılan yöntemlerin aynıları.

Düzenli ifade kalıpları oluşturma ilkeleri

Kod tabanında e-posta adreslerini bulmamız gereken bir örneğe bakalım. Amacımız:

Analog prizler

Düzenli ifadeler iki tür karakterden oluşur:

  • özel karakterler: ? * + () () ^ $ / .
  • Değişmez harfler.

Giriş dizelerini cıvatalar olarak ve şablonu da bunlar için bir dizi bağlayıcı olarak (uygun sırada) düşünün.

Özel karakterler

Normal ifadeleri test ederken özel karakterlerin nasıl çalıştığını bilmeniz gerekir:

  • Ters eğik çizgi karakteri \ normal ifadedeki başka bir özel karakterin yerini alabilir:
  • Nokta ve w - .

Yeni satırlar dışındaki tüm karakterleri eşleştirin. Bir noktaya ve yalnızca bir noktaya uygunluğu kontrol etmek istiyorsanız - , harflere, sayılara ve alt çizgilere uygunluğu kontrol etmek istiyorsanız - w

  • Köşeli parantezler.

Parantez içindeki karakterleri eşleştirin. Aralıkları destekler. Bazı örnekler:
o - herhangi bir a, b veya c ile eşleşir.
o büyük harfler.
veya herhangi bir sayı.
o - Herhangi bir küçük veya büyük harf alfabetik karakteriyle eşleşir.
İsteğe bağlı? 0 veya 1'i eşleştirin.
Yıldız işareti *.

Yıldız işareti 0 veya daha fazla karakteri belirtir.

1 veya daha fazla karakteri eşleştirin.

Kıvırcık parantez ().

Minimum ve maksimum değerler. Düzenli ifade söz diziminin bazı örnekleri:
o(1,) 1'den az değil.
o(1,3) 1'den 3'e.
o (1,64) 1'den 64'e.

E-posta adresleri için normal bir ifade elde etmek amacıyla tüm bunları ekleyelim:

/+@+(.+)*/i


PHP'de şöyle görünüyor:

preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);

Doğrulama için Normal İfade Kullanma

Zorluk: Giriş verilerinin beklediğimiz gibi olduğundan emin olun. Hedef 1: /[^w$.]/ Hedef 2: /^(1,2)$/

Normal ifadeler öğeleri bulmak için uygundur ancak tam olarak ne aradığınızı bilmeniz gerekir.

Doğrulama için ne zaman normal ifade kullanmamalısınız?

Pek çok durum PHP filter_var işlevi kullanılarak daha iyi ele alınır. Örneğin, e-posta adresi doğrulaması PHP'nin yerleşik filtreleri kullanılarak yapılmalıdır:

filtre_var(" [e-posta korumalı]", FILTER_VALIDATE_EMAIL)

Düzenli ifadeler kullanarak doğrulama

Satırın sonundaki normal ifadeler çapa kullanır:

^ - satırın başlangıcını gösterir.
$ satırın sonunu gösteren dolar işaretidir.

if (!preg_match("%^(1,2)$%", $_POST["subscription_frequency"])) ( $isError = true; )

Hariç Tutulan Karakter Sınıfları

[^abc] - yeni satırlar dahil a, b veya c dışındaki her şey.

Yalnızca alfasayısal karakterleri, tireleri, noktaları ve alt çizgileri girmenize olanak tanıyan bir örnek:

if (preg_match("/[^0-9a-z-_.]/i", $productCode)) ( $isError = true; )

Ara ve değiştir

Bul ve değiştir işlemlerini gerçekleştirmek için en yaygın PCRE işlevleri preg_replace() ve preg_replace_callback()'dir. Ancak hemen hemen aynı şeyi yapan preg_filter() ve preg_replace_callback_array() da vardır. Lütfen preg_replace_callback_array() fonksiyonunun PHP7'den beri mevcut olduğunu unutmayın.

Listedeki kelimeleri değiştirme

$konu = "Biraz elma yemek istiyorum."; echo preg_replace("/elma|muz|turuncu/", "meyve", $konu);

Sonuç

Biraz meyve yemek istiyorum.

Bir normal ifadenin alt kalıpları varsa ( parantez içinde), $N veya N'yi değiştirebilirsiniz (burada N bir tamsayıdır >= 1), buna "geri bağlantı" denir.

İki sayıyı yeniden düzenleme

$konu = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $konu);

Sonuç

Tarih biçimlendirmesini değiştir

$konu = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $konu);

Sonuç

Etiketteki URL'yi değiştirmeye ilişkin basit bir örnek

$konu = "Daha fazla makale için lütfen https://php.earth/doc adresini ziyaret edin."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $konu) ;

Sonuç