• Düzenli ifadeler (desenler). Düzenli ifadeler Düzenli ifadeler php veya

    Uzun zamandır düzenli ifadeleri anlamak istiyordum. Her ne kadar "anlamak" güçlü bir kelime olsa da. Düzenli ifadelerin ustası olma sanatında ustalaşmak için onlarla sürekli çalışmanız gerekir. Sözdizimini, özel karakterleri ve değiştiricileri öğrenmek yeterli değildir; bunları kullanabilmeniz gerekir. Ve kullanma yeteneği deneyimle birlikte gelir.

    Bu yazıda, çalışmasını bizzat anladığım düzenli ifadelerin kullanımına ilişkin örnekler yayınlayacağım.

    Özel karakterler tablosu

    Özel karakter Tanım
    \ Kaçış sembolü. Örnek: '/seo\/smo/'- seo/smo içeren satırla eşleşir.
    ^ Veri sembolünün başlangıcı. Örnek: '/^seo/'— seo kelimesiyle başlayan bir satırla eşleşir.
    $ Veri sembolü sonu. Örnek: '/blog$/'— blog kelimesiyle biten bir satırla eşleşir.
    . Satır besleme dışında herhangi bir karakter. Örnek: '/seo.ult/'- seopult, seo9ult, seo@ult vb. dizeyle eşleşir.
    Bu parantezlerin içinde, herhangi biri belirli bir yerde görünebilen, ancak yalnızca bir tane görünen karakterler listelenir. Örnek: '/seoult/'— yalnızca seopult, seokult veya seomult içeren satırlar eşleştirilecektir.
    | Veya. Aşağıdaki örnek.
    () Alt maske.
    ? Önceki karakterin veya alt kalıbın bir veya sıfır oluşumu.
    * Önceki karakterin veya alt kalıbın herhangi bir sayıda tekrarı. Sıfır dahil.
    + Bir veya daha fazla olay.
    Örnek: '/se+(op|om)?.*t/'- s harfi, ardından bir veya daha fazla e harfi, ardından op veya om kombinasyonu bir kez veya belki bir kez görünmeyebilir, ardından herhangi bir sayıda sembol ve t harfi.
    (a,b) Önceki karakterin veya alt desenin a'dan b'ye geçme sayısı. Örnek: (0,) - * ile aynı, (0,1) - ? ile aynı, (3,5) - 3, 4 veya 5 tekrar.

    Düzenli ifadeler kullanan basit PHP komut dosyaları örnekleri:

    1) Önceki ve sonraki ifadeler.

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // Box'tan sonra ing'in geldiği bir kelime bulun. Sözcük bulunursa işlev true, bulunmazsa false değerini döndürür.$pattern1 = "/Kutu(?=ing)/" ; preg_match($pattern1, "Box Day"); // false preg_match ($pattern1, "Noel'in Ertesi Günü" ) ; // doğru // kutusundan sonra ing içermeyen bir kelime bulun. Sözcük bulunursa işlev true, bulunmazsa false değerini döndürür.$model2 = "/kutu(?!ing)/" ; preg_match($pattern2, "iPhone ve iPad için kutu"); // true preg_match ($pattern2, "Boxing günü nedir?"); // false preg_match ($pattern2, "css-moz-box-shadow" ) ; // doğru // ing'in önünde kutu bulunmayan bir kelime bulun. Sözcük bulunursa işlev true, bulunmazsa false değerini döndürür.$desen3 = "/(?

    [^<]+?~","seo blogu",$metin); echo $metin; ?>

    3) Belirli bir sitenin Alexa Sıralaması değerini alın ve görüntüleyin.

    1 2 3 4 5 6 7 8 9 "#
    (.*?)
    #si", file_get_contents ( "http://www.alexa.com/siteinfo/($url)") , $a ) ; return trim (str_replace ("" , "" , strip_tags ($a [ 1 ] ) ) ) ; ) $alexa = alexa($url) ; echo $alexa; ?>

    (.*?)

    #si", file_get_contents("http://www.alexa.com/siteinfo/($url)"), $a); return trim(str_replace(",","",strip_tags($a))); ) $alexa = alexa($url); echo $alexa; ?>

    4) Sayfanın başlığını alın ve görüntüleyin.

    1 2 3 4 5 (.*)<\/title>/s" , $str , $m ) ; echo $m [ 1 ] ; ?>

    (.*)<\/title>/s", $str, $m); echo $m; ?>

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 \n \r \t ]/", "" , $içerik ) ; // yeni satır ve sekme karakterlerini boşluklarla değiştirin$içerik = preg_replace ("/(2,)/" , " " , $içerik ) ; // 2'den fazla boşluğu bir taneyle değiştir preg_match_all("/ ]*href=(?:"| \" )(.*)(?:"|\" )[^<>]*>(.*)<\/a>/iU", $içerik , $bağlantılar ) ; // bağlantıları topla if (sizeof ($links [ 1 ] ) > 0 ) // eğer bağlantılar bulunursa( $çıkış = dizi () ; // harici bağlantı dizisi foreach ($links [ 1 ] as $v ) ( if (preg_match ("/http:\/\/(www\.)(0,1)" . $domain . "/i" , $v )) ) // dahili bağlantıları ayıklayın( devam et ; ) if ( preg_match ( "/(http:|https :)?\/\/(www\.)(0,1)(.*)/i", $v)) // Dış referans( $çıkış = $v;)) return $çıkış; ) dönüş dizisi () ; ) $domain = "site"; $content = file_get_contents ("http://site/" ) ; $getoutlinks = getoutlinks($içerik, $etki alanı) ; için ($i = 0; $i<= count ($getoutlinks ) ; $i ++ ) { echo $getoutlinks [ $i ] . "
    " ; } ?>

    ]*href=(?:"|\")(.*)(?:"|\")[^<>]*>(.*)<\/a>/iU", $içerik, $bağlantılar); // bağlantılar toplanırsa (sizeof($bağlantılar) > 0) // bağlantılar bulunursa ( $out = dizi(); // her biri için harici bağlantıların dizisi ($bağlantılar olarak $v ) ( if (preg_match("/http:\/\/(www\.)(0,1)".$domain."/i", $v)) // dahili bağlantıları ayıklayın (devam edin; ) if (preg_match ("/(http:|https:)?\/\/(www\.)(0,1)(..com/"); $getoutlinks = getoutlinks($content, $domain); for ( $i = 0;$i<= count($getoutlinks); $i++) { echo $getoutlinks[$i]."
    "; } ?>

    Nerede:
    preg_replace— Düzenli bir ifade kullanarak arama ve değiştirme gerçekleştirir.
    preg_match- düzenli bir ifadeye karşı kontrol gerçekleştirir.
    preg_match_all— tüm eşleşmeleri bulur, preg_match ise yalnızca ilkini bulur.
    file_get_contents— dosyanın içeriğini tek satır olarak alın.
    düzeltme— satırın başındaki ve sonundaki boşlukları kaldırır.
    str_değiştir— arama dizesini yeni bir dizeyle değiştirir.
    strip_tags— bir dizeden html ve php etiketlerini kaldırır.
    boyutu- değişkendeki öğe sayısını alır.
    saymak— dizi öğelerinin sayısını veya nesne özelliklerinin sayısını sayar.

    Düzenli ifadeler çok güçlü fakat aynı zamanda anlaşılması zor bir dize işleme aracıdır. Ana noktaları anlatacağım. Düzenli ifade bir dize modelidir. Bu şablonu kullanarak oluşumları arayabilir, değiştirmeler yapabilir ve şablona uygunluğu kontrol edebilirsiniz.

    Desen oluşturma kuralları

    Şablon sınırları, genellikle " kullanılarak belirli sembollerle belirtilmelidir. / ", ama ben " kullanmayı tercih ediyorum # " Çünkü ileri/geri eğik çizgilerin çokluğu gözlerinizi kamaştırabilir ve karma işaretleri genellikle başka hiçbir yerde kullanılmaz. Yani: " #BuradaBodyRegularExpression#"

    Parantezler normal bir ifadenin içinde kullanılır; bunlar değiştirilebilen alt ifadelerdir, örneğin:

    #^/katalog/(+)/(+)\.html.*#

    Bu ifade bir dizedeki parametreleri almak için tasarlanmıştır. URL'si. Satırın başında özel bir karakter var " ^ " - bu satırın başlangıcı anlamına gelir. Sonraki gelir " /katalog/" - burada özel karakterler yok, bu sadece satırın içinde bulunması gereken bir metin. Sonra parantezlerle karşılaştık yani ilk alt ifadeye ulaştık. Köşeli parantezler bu yerde satırda bulunabilecek birçok karakteri belirtir. İşareti " - " numaralandırma anlamına gelir. İşaret " \ " özel karakterlerden kaçar. Böylece ilk alt ifadede BÜYÜK ve Latin alfabesinin küçük harflerini, 0'dan 9'a kadar sayıları, alt çizgiyi, tireyi ve noktayı alabiliriz. Çizgi ve nokta özel karakterlerdir, ancak burada bunlar kaçılmış, yani burada sadece semboller var. Köşeli parantezlerden sonra " + " - bu, önceki karakterin (ve bizim için bu, köşeli parantez içinde belirtilen bir dizi karakterdir) 1 veya daha fazla kez görünebileceği anlamına gelir. Sonra " gelir / " sadece bir sembol ve buna benzer ikinci bir alt ifade. Sonra " geliyor " \.html"metin ne anlama geliyor" .html". Ve sonra özel karakterler " .* "Nokta herhangi bir karakter anlamına gelir ve yıldız işareti de önceki karakterin herhangi bir miktarı anlamına gelir. Yani " sonrasında " .html"Her şey gidebilir.

    Miktar göstergesi, niceleyiciler

    Yukarıda, önceki sembollerin sayısını gösteren bu tür sembolleri zaten değerlendirdik. + Ve * . Miktarı belirtmeye yönelik tüm olasılıklar şunlardır:

    Özel karakterler

    Bazı karakter grupları için özel kısaltmalar vardır:

    "Açgözlülük"

    Düzenli ifade açgözlülüğü kavramına bakalım. Mesela şöyle bir satır var:

    #()#

    Şunu okuyoruz: alt ifade:

    Her şey doğru görünüyor, alt ifade uyuyor:

    Ama aynı zamanda uyuyor:

    Elde edeceğimiz şey bu, çünkü... Düzenli ifadeler varsayılan olarak açgözlüdür. Değiştiriciyi kullanarak açgözlülüğü ortadan kaldırabilirsiniz " sen", bunun gibi:

    #()#U

    Değiştiriciler

    Düzenli bir ifadenin ardından değiştiriciler gelebilir: " #HereBodyRegularExpression#HereDeğiştiriciler"Değiştirici türleri:

    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 meta karakterler "^" ve "$" tüm metnin başlangıcını ve sonunu belirtin. 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 " . " tanımında yeni satır karakteri içermez. Bu değiştiricinin belirtilmesi bu kısıtlamayı kaldırır.
    sen Düzenli ifade açgözlülüğünü ortadan kaldırır
    sen Düzenli ifadelerin çalışmasını sağlar Kiril'den UTF-8'e aksi takdirde düzgün çalışmaz.

    Düzenli ifadelerle çalışmaya yönelik php işlevleri

    preg_replace

    Ara ve değiştir:

    Preg_replace (karışık $desen , karışık $değiştirme , karışık $konu [, int $limit = -1 [, int &$sayımı ]]);

    Her değer bir dize veya dizi olabilir; $konu dizi - bir dizi döndürülür, aksi halde bir dize

    preg_split

    Bir dizeyi normal ifade kullanarak böler:

    Preg_split (string $desen , string $konu [, int $sınır = -1 [, int $bayraklar = 0 ]]);

    Verilen dizenin alt dizelerinden oluşan bir dizi döndürür ders desene karşılık gelen sınırlar boyunca bölünmüş olan model.

    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 “Düzenli İ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ğunu evrensel olarak kontrol etmek 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.

    Düzenli ifadeler, metindeki alt dizeleri aramaya yönelik özel kalıplardır. Onların yardımıyla, aşağıdaki sorunları tek satırda çözebilirsiniz: "bir dizenin sayı içerip içermediğini kontrol edin", "metindeki tüm e-posta adreslerini bulun", "ardışık birkaç soru işaretini bir taneyle değiştirin".

    Popüler bir programlama bilgeliğiyle başlayalım:

    Bazı insanlar bir sorunla karşılaştıklarında şöyle düşünürler: "Evet, akıllıyım, bunu düzenli ifadeler kullanarak çözeceğim." Şimdi onların iki problemi var.

    Şablon örnekleri

    Birkaç basit örnekle başlayalım. Aşağıdaki resimdeki ilk ifade 3 harflik bir diziyi arıyor; ilk harf “k”, ikincisi herhangi bir Rus harfi ve üçüncüsü ise büyük/küçük harfe duyarlı olmayan “t” (örneğin, “cat” veya “KOT) ” bu kalıba uyuyor). İkinci ifade, metni 12:34 formatında arar.

    Herhangi bir ifade sınırlayıcı karakterle başlar. / sembolü genellikle bu şekilde kullanılır, ancak düzenli ifadelerde özel bir amacı olmayan diğer sembolleri de kullanabilirsiniz, örneğin ~, # veya @. İfadede / karakterinin görünmesi durumunda alternatif sınırlayıcılar kullanılır. Daha sonra aradığımız dizenin deseni gelir, ardından ikinci bir sınırlayıcı gelir ve sonunda bir veya daha fazla bayrak harfi olabilir. Metin ararken ek seçenekler belirtirler. İşte bayrak örnekleri:

    • i - aramanın büyük/küçük harfe duyarlı olmaması gerektiğini söylüyor (varsayılan olarak büyük/küçük harfe duyarlıdır)
    • u - aranan ifade ve metnin yalnızca Latin harflerini değil, utf-8 kodlamasını kullandığını belirtir. Bu olmadan, Rusça (ve Latin olmayan diğer) karakterlerin aranması düzgün çalışmayabilir, bu nedenle onu her zaman ayarlamanız gerekir.

    Şablonun kendisi sıradan karakterlerden ve özel yapılardan oluşur. Mesela normal ifadelerdeki “k” harfi kendisi anlamına gelirken semboller “burada 0'dan 5'e kadar herhangi bir sayı olabilir” anlamına gelir. İşte özel karakterlerin tam listesi (PHP kılavuzunda bunlara metakarakterler denir) ve normal sıradaki diğer tüm karakterler sıradandır:

    Aşağıda bu karakterlerin her birinin anlamını analiz edeceğiz (ve ayrıca “е” harfinin neden ilk ifadede ayrı ayrı yerleştirildiğini açıklayacağız), ancak şimdilik normal ifadelerimizi metne uygulamaya çalışalım ve ne olacağını görelim. PHP'nin girdi olarak normal ifadeyi, metni ve boş bir diziyi alan preg_match($regexp, $text, $match) özel bir işlevi vardır. Metnin verilen kalıpla eşleşen bir alt dize içerip içermediğini kontrol eder ve değilse 0, varsa 1 değerini döndürür. Ve geçirilen dizide, düzenli diziyle ilk bulunan eşleşme, indeksi 0 olan elemana yerleştirilir. Düzenli ifadeleri farklı dizelere uygulayan basit bir program yazalım:

    Örneğe baktıktan sonra düzenli ifadeleri daha detaylı inceleyelim.

    Düzenli ifadelerde parantezler

    Farklı parantez türlerinin ne anlama geldiğini gözden geçirelim:

    • Kıvrımlı ayraçlar a(1,5), önceki karakterin tekrar sayısını belirtir - bu örnekte ifade, 1 ila 5 ardışık "a" harfini arar
    • Köşeli parantezler "bu karakterlerden herhangi biri" anlamına gelir; bu durumda a, b, c, x, y, z harfleri veya 0'dan 5'e kadar bir sayı. | gibi diğer özel karakterler köşeli parantezlerin içinde çalışmaz. veya * - normal bir karakteri belirtirler. Köşeli parantezlerin başında ^ sembolü varsa anlam tersine değişir: "belirtilenler dışında herhangi bir karakter" - örneğin [^a-c], "a, b veya c dışında herhangi bir karakter" anlamına gelir.
    • Parantezler karakterleri ve ifadeleri gruplandırır. Örneğin abc+ ifadesinde artı işareti yalnızca c harfini ifade eder ve bu ifade abc, abcc, abccc gibi kelimeleri arar. Ve a(bc)+ parantezlerini koyarsanız, nicelik belirteci artı bc dizisine karşılık gelir ve ifade abc, abcbc, abcbcbc kelimelerini arar.

    Not: Karakter aralıklarını köşeli parantez içinde belirleyebilirsiniz, ancak Rusça е harfinin alfabeden ayrı olduğunu ve “herhangi bir Rusça harfi” yazmak için [a-яе] yazmanız gerektiğini unutmayın.

    Bex eğik çizgiler

    Düzenli ifadelerle ilgili diğer eğitimlere baktıysanız muhtemelen ters eğik çizginin her yerde farklı yazıldığını fark etmişsinizdir. Bir yere bir ters eğik çizgi yazıyorlar: \d , ancak burada örneklerde 2 kez tekrarlanıyor: \\d . Neden?

    Normal ifade dili ters eğik çizgiyi bir kez yazmanızı gerektirir. Bununla birlikte, PHP'de tek ve çift tırnak içindeki dizelerde ters eğik çizginin de özel bir anlamı vardır: dizelerle ilgili kılavuz. Mesela $x = "\$"; yazarsanız daha sonra PHP bunu özel bir kombinasyon olarak ele alacak ve dizeye yalnızca $ karakterini ekleyecektir (ve normal ifade motoru bundan önceki ters eğik çizgiyi bilmeyecektir). \$ dizisini bir dizeye eklemek için ters eğik çizgiyi iki katına çıkarmalı ve kodu $x = "\\$"; .

    Bu nedenle bazı durumlarda (PHP'de karakter dizisinin özel bir anlamı olduğu durumlarda) ters eğik çizgiyi iki katına çıkarmamız gerekir:

    • Normal ifadede \$ yazmak için koda "\\$" yazıyoruz
    • Normal ifadede \\ yazmak için her ters eğik çizgiyi ikiye katlayıp "\\\\" yazarız
    • Ters eğik çizgiyi ve sayıyı (\1) normal biçimde yazmak için ters eğik çizgiyi iki katına çıkarmanız gerekir: "\\1"

    Diğer durumlarda, bir veya iki ters eğik çizgi aynı sonucu verecektir: "\\d" ve "\d" satıra bir çift \d karakteri ekleyecektir - ilk durumda, 2 ters eğik çizgi ters eğik çizgi ekleme sırasıdır ikinci durumda özel bir sıra yoktur ve karakterler olduğu gibi eklenecektir. Bir dizeye hangi karakterlerin ekleneceğini ve düzenli ifade motorunun ne göreceğini echo: echo "\$"; kullanarak kontrol edebilirsiniz. . Evet zor ama ne yapabilirsiniz?

    Normal sezona özel tasarımlar

    • \d herhangi bir rakamı arar, \D - rakam dışında herhangi bir karakter
    • \w herhangi bir harf (herhangi bir alfabeden), sayı veya alt çizgi _ ile eşleşir. \W, harf, sayı veya alt çizgi dışında herhangi bir karakterle eşleşir.

    Ayrıca, sözcük sınırını belirtmek için uygun bir koşul da vardır: \b . Bu yapı, bir tarafında harf/sayı/alt çizgi (\w) olan bir karakterin, diğer tarafında ise harf/sayı/alt çizgi olmayan bir karakterin olması gerektiği anlamına gelir. Mesela metinde “kedi” kelimesini bulmak istiyoruz. /cat/ui normal ifadesini yazarsak, bu harflerin sırasını herhangi bir yerde bulacaktır - örneğin "sığır" kelimesinin içinde. Açıkçası istediğimiz bu değildi. Normal ifadeye bir kelime sınır koşulu eklersek: /\bcat\b/ui, o zaman artık yalnızca tek başına "cat" kelimesi aranacaktır.

    Manuel

    • PHP'de normal ifade sözdizimi, ayrıntılı açıklama

    Düzenli ifadeler geliştiriciler için çok yararlı bir araçtır. Normal ifadeler, metnin doğruluğunu kontrol etmenize, aramanıza ve değiştirmenize olanak tanır.
    Bu makale, sıklıkla çalışmanız gereken bazı çok yararlı ifadeler içermektedir.

    Normal İfadelere Giriş

    Düzenli ifadelerle ilk kez tanıştıklarında anlaşılması ve kullanılması zor görünebilir. Aslında her şey göründüğünden daha basittir. Karmaşık örneklere bakmadan önce temellere bakalım:

    PHP'de normal ifadelerle çalışmaya yönelik işlevler

    Alan adı doğrulaması

    Doğru alan adının kontrol edilmesi.

    $url = "http://example.com/"; if (preg_match("/^(http|https|ftp)://(*(?:.*)+):?(d+)?/?/i", $url)) ( echo "Tamam."; ) else ( echo "Yanlış URL.";)

    Metindeki kelimeleri vurgulama

    için çok kullanışlı bir düzenli ifade. Aramak için kullanışlıdır.

    $text = "Örnek cümle, regex web programlamada popüler hale geldi. Şimdi regex'i öğreniyoruz. Wikipedia'ya göre, Düzenli ifadeler (regex veya regexp olarak kısaltılır, regex'lerin, regexp'lerin veya regexen'in çoğul biçimleriyle) resmi bir dilde yazılır. düzenli ifade işlemcisi tarafından yorumlanabilir"; $metin = preg_replace("/b(regex)b/i", " 1", $metin); echo $metin;

    WordPress'te vurgulanan arama sonuçları

    Daha önce de belirtildiği gibi, önceki örnek . Bunu WordPress'e uygulayalım. Dosyayı aç arama.php, işlevi bul başlık(). Aşağıdakiyle değiştirin:

    Echo $başlık;

    Şimdi bu satırın öncesine şu kodu girin:

    \0", $başlık); ?>

    Dosyayı aç stil.css. Satırı buna ekleyin:

    Strong.search-excerpt ( arka plan: sarı; )

    Bir HTML belgesindeki tüm görüntüleri alın

    Bir HTML sayfasındaki tüm görselleri bulmanız gerekirse aşağıdaki kod işinize yarayacaktır. Bununla birlikte, kullanarak kolayca bir resim yükleyici oluşturabilirsiniz.

    $resimler = dizi(); preg_match_all("/(img|src)=("|")[^"">]+/i", $veri, $medya); unset($veri); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($veri as $url) ( $info = pathinfo($url); if (isset($info["uzantı"])) ( if (($bilgi["uzantı"] == "jpg") || ($info["uzantı"] == "jpeg") || ($info["uzantı"] == "gif") || ($info["uzantı"] == "png")) array_push($ resimler, $url); ))

    Yinelenen kelimeleri kaldırma (büyük/küçük harften bağımsız)

    $metin = preg_replace("/s(w+s)1/i", "$1", $metin);

    Yinelenen noktalama işaretlerini kaldırma

    Öncekine benzer, ancak noktalama işaretlerini kaldırır.

    $metin = preg_replace("/.+/i", ".", $metin);

    XML/HTML etiketi bulma

    İki bağımsız değişken alan basit bir işlev: bulunacak etiket ve XML veya HTML içeren bir dize.

    Function get_tag($tag, $xml) ( $tag = preg_quote($tag); preg_match_all("(<".$tag."[^>]*>(.*?).")", $xml, $eşleşmeler, PREG_PATTERN_ORDER); $eşleşmeleri döndür;

    Belirli bir nitelik değerine sahip bir XML/HTML etiketi bulma

    İşlev öncekine benzer, ancak bir etiket niteliği belirlemek mümkün hale gelir. Örneğin:

    .

    Function get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($ öznitelik); $değer = preg_quote($değer); $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$value\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $eşleşmeler, PREG_PATTERN_ORDER); $eşleşmeleri döndür; )

    Hex Renk Kodlarını Bulma

    İşlev, onaltılık renk kodlarının doğruluğunu bulmanızı veya kontrol etmenizi sağlar.

    $string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "örnek 6 başarılı."; )

    Sayfa başlığını bulma

    Bu kod etiketler arasındaki metni bulup görüntüleyecektir. </i> Ve <i> HTML sayfaları.

    $fp = fopen("http://www.catswhocode.com/blog", "r"); while (!feof($fp))( $sayfa .= fgets($fp, 4096); ) $titre = eregi(" (.*)",$sayfa,$kayıtlar); echo $kayıtlar; fclose($fp);

    Apache günlüklerini ayrıştırma

    Birçok web sitesi Apache web sunucusunda çalışır. Siteniz aynı zamanda bir taco sunucusunda da çalışıyorsa aşağıdaki düzenli rutinler faydalı olabilir.

    //Günlükler: Apache web sunucusu // HTML dosyalarına başarılı erişim. Sayfa gösterimlerini saymak için kullanışlıdır. "^((?#istemci IP'si veya alan adı)S+)s+((?#temel kimlik doğrulama)S+s+S+)s+[((?#tarih ve saat)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^ ?]+?.html?)??((?#parametreler)[^ ?]+)? HTTP/+"s+(?#durum kodu)200s+((?#aktarılan bayt)[-0-9]+)s+"((?#yönlendiren)[^"]*)"s+"((?#kullanıcı aracısı) )[^"]*)"$" //Günlükler: Apache web sunucusu //404 hatalar "^((?#istemci IP'si veya etki alanı adı)S+)s+((?#temel kimlik doğrulama)S+s+S+)s+ [((?#tarih ve saat)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?]+)??((?#parameters)[^ ? "]+)? HTTP/+"s+(?#durum kodu)404s+((?#aktarılan bayt)[-0-9]+)s+"((?#yönlendiren)[^"]*)"s+"((?#kullanıcı aracısı) )[^"]*)"$")

    Çift tırnak işaretini kıvırcık tırnak işaretleri ile değiştirme

    preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $metin);

    Şifre karmaşıklığını kontrol etme

    Bu normal ifade, bir dizeyi noktadan noktaya kontrol eder: dize en az 6 harf, rakam, alt çizgi ve kısa çizgi içermelidir. Satırda en az bir büyük harf, bir küçük harf ve bir sayı bulunmalıdır.

    "A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"

    WordPress: Normal İfade Kullanarak Gönderi Görselleri Alma

    WordPress kullanıyorsanız, bir gönderideki tüm görselleri alıp görüntüleyecek bir özelliğe sahip olmanızı faydalı bulabilirsiniz. Bu kodu kullanmak için tema dosyalarınıza kopyalayın.

    Mesaj İçeriği; $szSearchPattern = "~ ]* />~"; // Tüm görselleri almak ve sonuçları $aPics dosyasına kaydetmek için preg_match_all komutunu çalıştırın preg_match_all($szSearchPattern, $szPostContent, $aPics); // En az 1 görselimiz olup olmadığını kontrol edin $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) ( // Şimdi burada resimlerle ne yapmanız gerekiyorsa onu yapacaksınız // Bu örnekte resimler sadece ($i=0; $i) için görüntüleniyor< $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

    İfadeleri resimlere dönüştürme

    Bu özellik WordPress'te de mevcuttur; metin ifadelerini otomatik olarak resimlerle değiştirmenize olanak tanır.

    $texte="Gülen yüz içeren bir metin:-)"; echo str_replace(":-)", ",$metin);