Normal ifadeler php ise. PHP'de Düzenli İfadeler. Doğrulamak için Normal İfade Ne Zaman Kullanılmaz?

  • 03.11.2019

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;
  • E-posta adresi, web sitesi etki alanı, telefon numarası, IP adresi gibi kullanıcı tarafından girilen 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 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
. Yeni satır karakteri dışında herhangi bir tek 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, 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.

İşlev Açıklaması:

preg_replace işlevi, dizgedeki (konu) verilerle normal ifadenin (desen) eşleşmelerini arar ve bunları, değiştirilen verilerle değiştirir.

Argüman

Tanım

model

Gerekli argüman. Normal ifade (arama düzeni)

dizi, dizi

yenisiyle değiştirme

Gerekli argüman. içindeki verileri değiştirmek için kullanılan verileri içeren dize veya dizi ders

Ayrıca, bağlantılar için, \$(1) gibi \$1'e eşdeğer bir yapı kullanabilirsiniz. Bu yapı, bağlantının hemen ardından bir rakam (\$(1)1) geliyorsa kullanılır.

dizi, dizi
ders Gerekli argüman. Değiştirilecek verileri içeren bir dize veya dizi. dizi, dizi
sınır

İsteğe bağlı argüman. Maksimum değiştirme sayısı. Varsayılan -1 (sınırsız)

int
saymak

İsteğe bağlı argüman. Yapılan değiştirme sayısını içeren bir değişken.

int

preg_replace() işlevi, /e değiştiricisiyle birlikte kullanılabilir. Bu değiştirici ile değiştirme parametresi PHP kodu olarak yorumlanır ve ardından değiştirme için kullanılır.

Düzenli ifadeler

Ayrı olarak, işlevin nasıl çalıştığını anlamanın (imkansız değilse bile) oldukça zor olduğunu anlamadan düzenli ifadeler üzerinde durmalıyız. preg_replace().

Wikipedia.org'da düzenli ifadelerin oldukça iyi bir açıklaması verilmiştir, ayrıca düzenli ifadeleri kullanmanın ana noktaları da açıklanmıştır.

Örnekler:

Örnek 1:

Bu örnekte, parantez içindeki tüm sayıları yıldızlarla değiştiriyoruz.

Örnek 2:

Bu örnekte, tüm kalıba karşılık gelen dizgiyi, \$1 bağlantısı altındaki ilk alt kalıba karşılık gelen verilerle değiştiriyoruz. Başka bir deyişle, "/(\w+) (\d+) (\w+)/" ile eşleşen "3 elma var", "sahip" eşleşmesi (\w+) ile değiştirilecektir.

Örnek 3:

Bu örnek, diziler kalıp ve değiştirme olarak kullanılırsa ne olacağını gösterir.

Örnek 4:

Bu örnek, desen, değiştirme ve konu dizilerse ne olacağını gösterir.

Örnek 5:

Bu örnek, /e değiştiricisinin kullanımını gösterir, yani değiştirme php kodu olarak yorumlandığında. Aşağıdaki, karakterlerin küçük harften büyük harfe dönüştürülmesini gösterir.

Örnek 6:

Bu örnek, sayım bağımsız değişkeninin kullanımını gösterir. Burada sonuç 2'ye eşit olacak, bu yüzden iki değişiklik vardı.

karışık preg_match(dize deseni, dize konusu [, dizi &eşleşir [, int flags [, int offset]]])

Verilen metin konusunu desenle eşleşmeler için arar

İsteğe bağlı eşleşmeler parametresi belirtilirse, arama sonuçlarıyla doldurulur. $matches öğesi, dizenin tüm desenle eşleşen bölümünü, $matches dizenin ilk alt desenle eşleşen bölümünü içerir, vb.

bayraklar aşağıdaki değerleri alabilir:

PREG_OFFSET_CAPTURE

Bu bayrak belirtilirse, bulunan her alt dizi için kaynak dizideki konumu belirtilir. Bu bayrağın döndürülen verilerin biçimini değiştirdiği unutulmamalıdır: her oluşum, sıfır öğesi bulunan alt dizeyi içeren bir dizi olarak döndürülür ve ilk öğe ofseti içerir. Bu bayrak PHP 4.3.0 ve sonraki sürümlerde mevcuttur.

Ek bayraklar parametresi PHP 4.3.0'dan beri mevcuttur.

Arama, satırın başından itibaren soldan sağa doğru yapılır. Arama için alternatif bir başlangıç ​​konumu belirtmek için isteğe bağlı ofset parametresi kullanılabilir. Ek ofset parametresi PHP 4.3.3'ten itibaren mevcuttur.

Yorum: offset parametresinin kullanılması, işlev çağrılırken eşleşen dizenin substr($subject, $offset) ile değiştirilmesine eşdeğer değildir. preg_match_all(), desen gibi koşulları içerebileceğinden ^ , $ veya (? . Karşılaştırmak:

Bu örnek yapılırken

İşlev preg_match() bulunan eşleşme sayısını döndürür. 0 (eşleşme bulunamadı) ve 1 olabilir, çünkü preg_match() bulunan ilk eşleşmeden sonra sona erer. Tüm eşleşmeleri bulmanız veya saymanız gerekiyorsa, işlevi kullanmalısınız. preg_match_all(). İşlev preg_match()İadeler YANLIŞ yürütme sırasında herhangi bir hata olması durumunda.

İpucu: işlevi kullanmayın preg_match(), verilen dizgede bir alt dizginin varlığını kontrol etmek istiyorsanız. Bunun için kullanın strpos() veya strstr(), çünkü bu görevi çok daha hızlı tamamlayacaklar.


Örnek 2: Metinde "web" kelimesini bulma

/*
Desendeki özel \b dizisi, bir kelime sınırı anlamına gelir,
bu nedenle, "web" kelimesinin yalnızca izole bir oluşumu eşleşir
"dokuma" veya "örümcek ağı"nın aksine maske.
*/
if (preg_match("/\bweb\b/i" , "PHP, tercih edilen web betik dilidir.")) {
Eko "Giriş bulundu.";
) başka (
Eko "Giriş bulunamadı.";
)preg_match("/\bweb\b/i", "PHP, tercih edilen web sitesi betik dilidir.")) {
Eko "Giriş bulundu.";
) başka (
Eko "Giriş bulunamadı.";
}
?>
1.6K

Düzenli ifadeler (regex olarak kısaltılır) arama modellerini oluşturan karakter dizileridir. Esas olarak dizi eşleştirme modellerinde kullanılırlar.

Kısa hikaye

  • Her şey 1940'larda ve 1960'larda birçok akıllı insanın düzenli ifadelerden bahsettiği zaman başladı;
  • 1970'ler g/re/p;
  • 1980 Perl ve Henry Spencer;
  • 1997 PCRE (Perl Uyumlu Normal İfadeler). Normal ifadeler dediğimiz şeyin yükselişi o zaman başladı. PCRE, hemen hemen her dil için kitaplıklar sağlar.

PHP'de düzenli ifadelerin yaygın kullanımı

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

Maç Karşılaştırması

İfade, bir eşleşme bulunursa 1, değilse 0 ve bir hata oluşursa false döndürür:

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

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

int preg_match_all (string $desen, string $konu [, dizi &$eşleşmeler [, int $flags = 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 $desen, karışık $değiştirme, karışık $konu [, int $limit = -1 [, int $sayım ]])

JavaScript'te düzenli ifadelerin yaygın kullanımı

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

Maç Karşılaştırması

Bir eşleşme dizisi döndürür veya eşleşme bulunmazsa null:

string.match(RegExp);

Yenisiyle değiştirme

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

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

JavaScript'te düzenli ifadelerin özellikleri

  • Nokta hiçbir zaman yeni satırla eşleşmez:
  • Normal bir ifadeyle eşleştirme ve değiştirme için onlarsız yöntemlerle aynı yöntemler.

Normal İfade Modelleme İlkeleri

Bir kod tabanında e-posta adreslerini bulmamız gereken bir örneğe bakalım. Hedefimiz:

Analog prizler

Normal ifadeler iki tür karakterden oluşur:

  • Özel semboller: ? * + () () ^ $ / .
  • Değişmezler.

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

Özel semboller

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

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

Yeni satırlar hariç tüm karakterlerle eşleşir. Harfler, sayılar ve alt çizgiler için bir nokta ve yalnızca bir nokta olup olmadığını kontrol etmek istiyorsanız - w

  • Köşeli parantez .

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

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

1 veya daha fazla karakteri eşleştirin.

Kıvırcık parantezler ().

Minimum ve maksimum değerler. Bazı normal ifade sözdizimi örnekleri:
o (1,) en az 1.
o (1,3) 1'den 3'e.
o (1.64) 1'den 64'e kadar.

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

/[e-posta korumalı]+(.+)*/i


PHP'de nasıl görünüyor:

preg_match_all("/ [e-posta korumalı]+(.+)*/i", $giriş_satırları, $çıkış_dizisi);

Doğrulama için Normal İfade Kullanma

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

Normal ifadeler, öğeleri bulmak için iyidir, ancak ne aradığınızı bilmeniz gerekir.

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

Birçok durum PHP'nin filter_var işleviyle daha iyi işlenir. Örneğin, bir e-posta adresinin doğrulanması PHP'nin yerleşik filtreleri kullanılarak yapılmalıdır:

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

Normal ifadelerle doğrulama

Bir satırın sonundaki normal ifadeler çapa kullanır:

^ - bir satırın başlangıcını gösterir.
$, satırın sonunu gösteren bir 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ışında herhangi bir şeydir.

Yalnızca alfasayısal karakterler, kısa çizgiler, noktalar ve alt çizgiler sağlayan bir örnek:

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

Ara ve Değiştir

Arama ve değiştirme 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. preg_replace_callback_array() işlevinin PHP7'den beri mevcut olduğunu unutmayın.

Listedeki kelimeleri değiştirin

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

Sonuç

Biraz meyve yemek istiyorum.

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

iki sayının permütasyonu

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

Sonuç

Tarih biçimlendirmesini değiştirme

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

Sonuç

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

$subject = "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ç

int preg_match_all(dize deseni, dize konusu, dizi &eşleşir [, int flags [, int offset]])

Tüm desen eşleşmeleri için konuyu arar ve sonucu bayrak kombinasyonu tarafından belirtilen sırayla eşleşmeler dizisine yerleştirir.

İlk eşleşmeyi bulduktan sonra, sonraki aramalar dizinin başından değil, en son bulunan oluşumun sonundan yapılır.

İsteğe bağlı flags parametresi aşağıdaki değerleri birleştirebilir (kullanmanın PREG_PATTERN_ORDER ile aynı anda PREG_SET_ORDER anlamsız):

PREG_PATTERN_ORDER

Bu bayrak ayarlanırsa, sonuç şu şekilde sıralanır: $matches öğesi, modelin tam eşleşmelerinin bir dizisini içerir, $matches öğesi, ilk alt modelin bir dizi tekrarını içerir, vb.

Bulunan modelin oluşum sayısını verir (sıfır olabilir) veya YANLIŞ yürütme sırasında herhangi bir hata oluştuysa.


Örnek 2 Açgözlü Eşleşen HTML Etiketleri

// \\2 girişi, alt model başvurularının kullanımına bir örnektir.
// Alt dizenin sabitlenen dizeyle eşleşmesi gerektiği anlamına gelir
// ikinci alt model, örneğimizde ([\w]+).
// Çift tırnak kullanıldığından fazladan eğik çizgi gereklidir.
$html = "kalın yazıbeni tıkla" ;preg_match_all( "/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/" , $html , $eşleşir );$i = 0 ; $ ben< count ($matches [ 0 ]); $i ++) {
echo "eşleşti:" . $eşleşir [ 0 ][ $i ] . "\n" ;
yankı "bölüm 1:" . $eşleşir [ 1 ][ $i ] . "\n" ;
yankı "bölüm 2:" . $eşleşir [ 3 ][ $i ] . "\n" ;
yankı "bölüm 3:" . $eşleşir [ 4 ][ $i ] . "\n\n" ;
}
?>

Örneğin sonucu: