php normal ifade karakterleri. Normal ifade işlevleri. WordPress: Bir gönderiden resim almak için normal bir ifade kullanma

  • 03.11.2019

Perl'de düzenli ifadelerin en yaygın kullanımı, arama ve değiştirme operatörleridir. s//, m/, bağlantı operatörleri =~ veya != vb. Kural olarak, tüm bu operatörler aşağıdakiler gibi benzer seçeneklere sahiptir:

Genellikle tüm bu seçenekler "/x" olarak gösterilir. Yeni yapıyı kullanarak şablonların içinde bile kullanılabilirler (?...)

Normal ifadeler veya kalıplar (kalıp), Unix'teki normal ifade prosedürleriyle aynıdır. İfadeler ve sözdizimi, Henry Spencer'ın serbestçe dağıtılan V8 rutinlerinden ödünç alınmıştır ve burada ayrıntılı olarak açıklanmıştır.

Şablonlar, genellikle egrep standardı olarak adlandırılan aşağıdaki meta karakterleri (diğer karakter gruplarını gösteren karakterler) kullanır:

Meta karakterlerin değiştiricileri vardır (meta karakterden sonra yazılır):

Diğer tüm durumlarda, küme parantezleri normal (normal) karakterler olarak kabul edilir. Böylece "*", (0,), "+" ile (1,) ve "?" ile eşdeğerdir. -(0.1). n ve m 65536'dan büyük olamaz.

Meta karakterlerin varsayılan eylemi "açgözlüdür". Aşağıdaki meta karakterlerin sonucundan bağımsız olarak, eşleşme mümkün olduğunca çok uzatılır. "İştahlarını azaltmak" istiyorsanız, "?" karakterini kullanın. Meta karakterlerin anlamını değiştirmez, sadece yayılmayı azaltır. Böylece:

Desenler çift tırnak ile aynı şekilde çalışır, böylece içlerinde `\` - karakterleri (ters eğik çizgi karakterleri) kullanabilirsiniz:

\T - sekme karakteri
\n - Yeni hat
\r - taşıma dönüşü
\fakat - biçim çevirisi
\v - dikey sekme
\a - aramak
\e - kaçmak
\033 - sekizli karakter gösterimi
\x1A - onaltılık
\C[ - kontrol karakteri
\l - küçük harf sonraki karakter
\u - büyük harf -//-
\L - \E'ye kadar tüm küçük harfler
\U - üstte -//-
\E - durum değişikliği sınırlayıcı
\Q - meta karakter olarak eylemi geri al

Ek olarak, Perl'e aşağıdaki meta karakterler eklendi:

Bunların hepsinin "bir" karakter olduğuna dikkat edin. Bir dizi belirtmek için değiştiricileri kullanın. Böyle:

Ayrıca hayali meta karakterler de var. Değer değişikliği yerine var olmayan karakterleri belirtmek. Gibi:

Kelime sınırı (\b), \w ve \W karakterleri arasındaki hayali noktadır. Bir karakter sınıfı içinde, "\b" bir geri silme (silme) karakterini belirtir. meta karakterler \A Ve \Z- "^" ve "$" ile benzer, ancak "^" satırının başı ve "$" satırının sonu çok satırlı dizedeki her satır için geçerliyse, \A Ve \Z tüm çok satırlı dizenin başlangıcını ve sonunu belirtin.

Kalıp içinde gruplama (parantez) kullanılıyorsa, grubun alt dizi numarası "\number" olarak gösterilir. Bir ifade veya blok içindeki kalıbı takip ederek, bu grupların "$number" olarak gösterildiğine dikkat edin. Ek olarak, ek değişkenler vardır:

Örnek vermek:

$s = "Bir 1 iki 2 ve üç 3"; if ($s =~ /(\d+)\D+(\d+)/) ( "$1\n" yazdır; # Sonuç "1" yazdır "$2\n"; # "2" yazdır "$+\n" ; # "2" yazdır "$&\n"; # "1 iki 2" yazdır "$`\n"; # "Bir " yazdır "$"\n"; # " ve üç 3")

Perl sürüm 5, ek şablon yapıları içerir:

Örnek vermek:

$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # "-" ile başlayan rakamı bulun ("$1\n" yazdır; # Sonuç "2" dir) else ( "arama başarısız oldu\n yazdır" " ; )

(?!şablon) - olumsuzlama ile ileriye doğru "gözetleme":

Örnek vermek:

$s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) # "+" ile devam etmeyen bir rakam bulun ( "$1\n" yazdır; # Sonuç "2" ) else ( "arama yazdır" başarısız\ n"; )

(?ismx) - "dahili" değiştiriciler. Örneğin, şablonun içinde bir değiştirici belirtmeniz gereken şablonlarda kullanmak uygundur.

Normal ifade kuralları. (normal ifade)

  1. Bir meta karakter olmadığı sürece herhangi bir karakter kendini gösterir. Bir meta karakteri geri almanız gerekiyorsa, önüne bir "\" koyun.
  2. Bir karakter dizisi, bu karakterlerden oluşan bir diziyi belirtir.
  3. Olası karakterler (sınıf) kümesi köşeli parantezler "" içine alınmıştır; bu, parantez içinde belirtilen karakterlerden birinin bu yerde olabileceği anlamına gelir. Parantez içindeki ilk karakter "^" ise - belirtilen karakterlerden hiçbiri ifadede bu yerde olamaz. Bir sınıf içinde, bir dizi karakter belirtmek için "-" karakterini kullanabilirsiniz. Örneğin, a-z Latin alfabesinin küçük harflerinden biridir, 0-9 bir sayıdır vb.
  4. PHP portalı forumu. SU

PHP regexp, tek bir ifadede yapılabilecek güçlü bir model eşleştirme algoritmasıdır. PHP düzenli ifadeleri, karmaşık ifadeler oluşturmak için aritmetik operatörleri (+, -, ^ gibi) kullanır.

Hangi normal ifadeler için kullanılır:

  • Normal ifadeler, tek bir işlev çağırarak dize verilerini tanımlamayı kolaylaştırır. Bu, kod yazarken zaman kazandırır;
  • Kullanıcı tarafından girilen e-posta adresi, web sitesi etki alanı, telefon numarası, IP adresi gibi verileri kontrol ederken;
  • Arama sonuçlarında anahtar kelimeleri vurgulama;
  • Etiketleri tanımlamak ve değiştirmek için normal ifadeler kullanılabilir.

PHP'de Normal İfadeler

PHP, normal ifadelerle çalışmanıza izin veren yerleşik işlevler içerir. Şimdi yaygın olarak kullanılan PHP düzenli ifade işlevlerine bir göz atalım.

  • preg_match, bir dizgede kalıp eşleştirmesi yapmak için kullanılır. Bir eşleşme bulunursa true, eşleşme bulunamazsa false döndürür;
  • preg_split - bir dizgiyi bir kalıba göre bölmek için kullanılır, sonuç sayısal bir dizi olarak döndürülür;
  • preg_replace - kalıba göre arama yapmak ve belirtilen dizeyle değiştirmek için kullanılır.

preg_match , preg_split veya PHP regexp replace gibi normal ifade işlevlerinin sözdizimi aşağıdadır:

"function_name" preg_match veya preg_split veya preg_replace'dir.
"/.../" - eğik çizgiler normal ifadenin başlangıcını ve sonunu işaretler.
"'/pattern/"" eşleştirmemiz gereken kalıptır.
"nesne", kalıbın eşleştirileceği dizedir.

Şimdi yukarıda bahsedilen fonksiyonları kullanmanın pratik örneklerine bakalım.

Preg_match

İlk örnek, verilen URL'deki guru sözcüğü üzerinde basit bir kalıp eşleştirmesi gerçekleştirmek için preg_match işlevini kullanır.

Aşağıdaki kod, bu örneğin bir uygulamasını gösterir:


Çıktıdan sorumlu olan kodun bir bölümünü düşünün "preg_match('/guru/', $my_url)".

"preg_match(...)" PHP eşleşme normal ifade işlevidir.
"'/Guru/"" bir normal ifade kalıbıdır.
"$My_url", eşleştirilecek metni içeren bir değişkendir.

preg_split

Şimdi preg_split işlevini kullanan başka bir örneğe bakalım.

Bir cümle alıp bir diziye böleceğiz; desen, tek bir boşluk aramak için tasarlanmıştır:

Preg_replace

Bir kalıp eşleşmesi gerçekleştiren ve bulunan sonucu başka bir dizeyle değiştiren preg_replace işlevini düşünün.

Aşağıdaki kod, bir dizgede guru kelimesini arar. Arka plan rengini ayarlayan css koduyla değiştirir:

guru", $metin); eko $metin; ?>

meta karakterler

Yukarıdaki örneklerde basit şablonlar kullanılmıştır. Meta karakterler, bir e-posta adresinin doğrulanması gibi daha karmaşık PHP normal ifade kalıp eşleştirmesine izin verir. Yaygın olarak kullanılan meta karakterleri düşünün.

meta karakter Tanım Örnek vermek
. Yeni satır karakteri dışında herhangi bir karakterle eşleşir. /./ - tek bir karakter içeren herhangi bir şey.
^ / karakterini içermeyen bir satırın başlangıcını belirtir. /^PH/, PH ile başlayan herhangi bir satırdır.
$ Bir satırın sonunda bir desen belirler. /com$/ - guru99.com, yahoo.com, vb.
* Sıfır veya daha fazla herhangi bir sayıda karakteri belirtir. /com*/ - bilgisayar, iletişim vb.
+ Metakarakter karakter(ler)inden önce en az bir kez gereklidir. /yah+oo/ - yahoo.
Kalkan sembolü. /yahoo+.com/ - bir noktayı gerçek değer olarak ele alır.
[…] Karakter sınıfı. // - abc.
a-z Küçük harfleri ifade eder. /a-z/ - havalı, mutlu, vb.
A'dan Z'ye Büyük harfleri gösterir. /A-Z/ - NE, NASIL, NEDEN vb.
0-9 0'dan 9'a kadar herhangi bir sayıyı gösterir. /0-4/ — 0,1,2,3,4.

Şimdi bir e-posta adresinin geçerli olup olmadığını kontrol eden karmaşık bir PHP normal ifade örneğine bakalım:

Sonuç: e-posta adresi [e-posta korumalı] geçerlidir.

Şablonun açıklaması " [e-posta korumalı]+.(2,5)$/] "

"'/…/"" normal ifadeyi başlatır ve bitirir.
"^", küçük veya büyük harflerle, 0'dan 9'a kadar olan sayılarla ve noktalar, alt çizgiler veya kısa çizgilerle eşleşir.
« [e-posta korumalı]' @ karakteri ve ardından küçük veya büyük harfler, 0'dan 9'a kadar sayılar veya kısa çizgilerle eşleşir.
"+.(2,5)$/" ters eğik çizgi, ardından küçük veya büyük harf kullanan bir noktayı belirtir, dizenin sonundaki karakter sayısı 2 ile 5 arasında olmalıdır.

Normal ifadeler, metinde bir alt dize aramak için özel kalıplardır. Onların yardımıyla, bu tür sorunları tek bir satırda çözebilirsiniz: "dizenin sayı içerip içermediğini kontrol edin", "metindeki tüm e-posta adreslerini bulun", "birkaç ardışık soru işaretini bir tane ile değiştirin".

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

Bazı insanlar bir problemle karşılaştıklarında "Evet akıllıyım, normal ifadelerle çözerim" diye düşünürler. Şu an iki problemleri var.

Şablon örnekleri

Birkaç basit örnekle başlayalım. Aşağıdaki resimdeki ilk ifade, ilk harfin "k", ikincisinin herhangi bir Rusça harf olduğu ve üçüncünün büyük/küçük harfe duyarsız bir şekilde "t" olduğu 3 harflik bir dizi arar (örneğin, "kot" veya "CAT" bu kalıba uyar). İkinci ifade, metni 12:34 biçiminde bir süre için arar.

Herhangi bir ifade bir sınırlayıcı karakterle başlar (İngilizce'de sınırlayıcı). / sembolü genellikle olduğu gibi kullanılır, ancak ~ , # veya @ gibi normal ifadelerde özel bir amacı olmayan diğer karakterler kullanılabilir. / karakteri ifadede yer alabiliyorsa, alternatif sınırlayıcılar kullanılır. Ardından aradığımız dizenin şablonu gelir, ardından ikinci sınırlayıcı gelir ve sonunda bir veya daha fazla bayrak harfi gelebilir. Metin ararken ek seçenekler ayarlarlar. İş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ı)
  • u - aranmakta olan ifadenin ve metnin yalnızca latin harflerini değil, utf-8 kodlamasını kullandığını söylüyor. Onsuz, Rusça (ve Latin olmayan diğer) karakterlerin aranması düzgün çalışmayabilir, bu nedenle her zaman kullanmalısınız.

Şablonun kendisi normal karakterlerden ve özel tasarımlardan oluşur. Örneğin, normal ifadelerdeki "k" harfi kendisi anlamına gelir, ancak semboller "0'dan 5'e kadar herhangi bir sayı bu yerde olabilir" anlamına gelir. Özel karakterlerin tam listesi (php kılavuzunda bunlara meta karakterler denir) ve normal ifadedeki diğer tüm karakterler sıradandır:

Aşağıda bu karakterlerin her birinin anlamını analiz edeceğiz (ve ayrıca ilk ifadede “ё” harfinin neden ayrı ayrı yerleştirildiğini de açıklayacağız), ancak şimdilik normal ifadelerimizi metne uygulamaya çalışacağız ve ne olduğunu göreceğiz. PHP, girdi olarak normal bir ifade, metin ve boş bir dizi alan preg_match($regexp, $text, $match) özel bir işlevine sahiptir. Metnin, verilen desenle eşleşen bir alt dize içerip içermediğini kontrol eder ve değilse 0 veya varsa 1 döndürür. Ve iletilen dizide, normal ifadeyle ilk bulunan eşleşme, 0 dizinli öğeye yerleştirilir. Normal ifadeleri farklı dizgilere uygulayan basit bir program yazalım:

Örneği gördüğümüze göre, düzenli ifadeleri daha ayrıntılı olarak inceleyelim.

Normal ifadelerde parantezler

Farklı parantez türlerinin ne anlama geldiğini özetleyelim:

  • Kıvrımlı parantezler 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 ile 5 arasındaki bir sayı. Köşeli parantezlerin içinde, | veya * - normal bir karakteri belirtirler. Başında köşeli parantez içinde bir ^ karakteri varsa, anlam tersine çevrilir: "belirtilenler dışında herhangi bir karakter" - örneğin, [^ac] "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 harfine atıfta bulunur ve bu ifade abc, abcc, abccc gibi sözcükleri arar. Ve a (bc) + parantezlerini koyarsanız, artı niceleyici zaten bc dizisine atıfta bulunur ve ifade abc, abcbc, abcbcbc kelimelerini arar

Not: karakter aralıkları köşeli parantez içinde belirtilebilir, ancak Rusça ё harfinin alfabeden ayrı olduğunu ve "herhangi bir Rus harfini" yazmak için [а-яё] yazmanız gerektiğini unutmayın.

bexleshi

Normal ifadelerle ilgili diğer öğreticilere baktıysanız, muhtemelen ters eğik çizginin her yerde farklı yazıldığını fark etmişsinizdir. Bir yerde bir ters eğik çizgi yazarlar: \d , ancak burada örneklerde 2 kez tekrarlanır: \\d . Niye ya?

Normal ifade dili, ters eğik çizgiyi bir kez yazmanızı gerektirir. Bununla birlikte, PHP'deki tek ve çift tırnaklı dizelerde ters eğik çizginin özel bir anlamı vardır: dizeler hakkında bir kılavuz. Örneğin, $x = "\$" yazarsanız; daha sonra PHP bunu özel bir kombinasyon olarak alır ve dizgeye yalnızca $ karakterini ekler (ve normal ifade motoru ondan önceki ters eğik çizgiyi bilmez). \$ dizisini bir dizgeye eklemek için, ters eğik çizgiyi ikiye katlamalı ve kodu $x = "\\$"; .

Bu nedenle, bazı durumlarda (bir karakter dizisinin PHP'de özel bir anlamı olduğu durumlarda) ters eğik çizgiyi ikiye katlamamız gerekir:

  • \$ normal ifadesinde yazmak için "\\$" kodunu yazıyoruz
  • Normal ifadede \\ yazmak için, her bir ters eğik çizgiyi ikiye katlar ve "\\\\" yazarız.
  • Normal bir ifadede bir ters eğik çizgi ve bir sayı (\1) yazmak için ters eğik çizgi iki katına çıkarılmalıdır: "\\1"

Diğer durumlarda, bir veya iki ters eğik çizgi aynı sonucu verir: "\\d" ve "\d", dizeye bir çift \d karakteri ekler - 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. Dizeye hangi karakterlerin ekleneceğini ve normal ifade motorunun ne göreceğini, echo: echo "\$"; . Evet, zor ama ne yapabilirsin?

Düzenli ifadelerde özel yapılar

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

Ayrıca, bir sözcük sınırına işaret etmek için uygun bir koşul vardır: \b . Bu yapı, bir tarafında harf / sayı / alt çizgi (\w) olan bir karakter olması ve diğer tarafında olmaması gerektiği anlamına gelir. Örneğin, metinde "kedi" kelimesini bulmak istiyoruz. /cat/ui normal ifadesini yazarsak, bu harflerin sırasını herhangi bir yerde bulur - örneğin, "canavar" kelimesinin içinde. İstediğimiz bu değildi açıkçası. Normal ifadeye bir kelime sınır koşulu eklersek: /\bcat\b/ui , o zaman şimdi sadece ayrı "cat" kelimesi aranacaktır.

Manuel

  • PHP'de düzenli ifadelerin sözdizimi, ayrıntılı açıklama