Basit RegEx PHP

8 Cevap php

Ben bir dize var ve ben bunu "_archived" aşağıdakileri içerir olmadığını görmek gerekir.

Ben şu kullanıyordum:

preg_match('(.*)_archived$',$string);

ama olsun:

Warning: preg_match() [function.preg-match]: Unknown modifier '_' in /home/storrec/classes/class.main.php on line 70

Ben bu yüzden bu muhtemelen çok kolaydır Düzenli ifadeler için yeni.

Ya ben gibi bir çok basit bir şey kullanarak olmalıdır

strstr($string, "_archived");

Şimdiden teşekkürler

8 Cevap

strstr bu durumda yeterli olduğunu, ancak sorunu çözmek için, sizin regex için ayraçları eklemek gerekir. Sınırlayıcı başlar ve böylece gibi, regex biter özel bir karakter:

preg_match('/_archived/',$string);

Ayraç farklı karakter bir sürü olabilir, ancak her zamanki seçimler, / # ve! Vardır. PHP manuel:

Herhangi bir karakter sürece alfanümerik değil gibi ayraç için kullanılabilir, ters eğik çizgi () veya boş bayt. Ayraç karakteri, ifadenin kendisi kullanılacak varsa, bu ters eğik çizgiden gerekmektedir. PHP 4.0.4 'ten beri, ayrıca [], Perl-tarzı () {} kullanmak ve <> ayraç olabilir.

PHP düzenli ifade sözdizimi hakkında her şeyi okuyun here.

Sen PHP manual here geçerli (ve geçersiz) desenler bazı örnekler görebilirsiniz.

strstr ($ string, "_archived");

Eğer tarif sorunu için yol daha kolay olacak.

Sık sık alıntı gibi

Bazı insanlar, bir sorun ile karşılaştıklarında, "Ben normal ifadeler kullanmak olacak, biliyorum." Düşünmek Şimdi iki sorun var. - Jamie Zawinski

Sadece mesela, bazı sınırlayıcı gerekir / ile desen içine

preg_match('/_archived$/',$string);

Perl regexes Eğer regex bir sürü / kullanıyorsa kullanışlı herhangi bir ayırıcı, kullanalım. Ben sık sık, örneğin parantez kullanarak kendimi buluyorum:

preg_match('{_archived$}',$string);

Ayrıca, size sadece (dize onunla biter görmek için ucunda ki $ sembolü test ediyoruz "_archived" önce biraz yakalamak değil gibi (. *) Biraz gerekmez unutmayın maçlar dizenin sonu)

Bir dize bir dize içeriyorsa aradığınız tüm ise, o zaman elbette basit sürümünü kullanın. Ama aynı zamanda sadece yapabilirsiniz:

preg_match('/_archived/', $string);

Deneyin:

preg_match('/(.*)_archived$/',$string);

String $ dize varsa, sadece kontrol ediyorsanız, strstr olsa sizin için yeterli olacaktır.

strstr () veya strpos () böyle bir şey bulmak için daha iyi olurdu, ben düşünürdüm. Eğer alıyveyasanız hata düzenli ifadenin etrafında herhangi bir sınırlayıcı olmaması nedeniyle. Kullanmayı deneyin

"/(.*)_archived$/"

veya

"#(.*)_archived$#".

... Muhtemelen bu uygulamak için en iyi yoldur. Sen bir regex overkill olduğunu haklısın.

Eğer overkill biraz düzenli ifadeler kullanarak, aradığınız belirli bir dize varsa. Burada iyi PHP'nin standart string arama işlevlerinden birini kullanarak olacak.

Strstr işlevi çalışacaktır, ama geleneksel PHP Bilgelik (okuyun: mit, efsane, hurafe, the manual) strpos işlevini kullanarak daha iyi performans verecektir söylüyor. gibi yani, bir şey

if(strpos($string, '_archived') !== false) {
}

Sen onu en samanlıkta başında bir iğne bulduğunda strpos döner "0" olarak, burada gerçek eşitsizlik operatörünü kullanmak isteyeceksiniz. the manual Bu konuda daha fazla bilgi için bkz.

"|" Veya "(" veya "{" veya sorununa gelince, PHP'nin düzenli ifade motoru farklı karakterleri bir dizi biridir ("/" veya olabilir sınırlayıcı bir dizi ile düzenli ifade dize içine bekliyor "#", ya da ...). PHP motoru düzenli bir ifade istediğiniz düşünüyor

.*

model olan modifiye bir dizi

_archived$

Eğer düzenli bir ifade kullanmak çok zaman, gelecekte, böyle bir şey deneyin

//equivilant
preg_match('/(.*)_archived$/i',$string);
preg_match('{(.*)_archived$}i',$string);
preg_match('#(.*)_archived$#i',$string);

"/", "#" Ve "{}" karakterleri sınırlayıcılardır. Onlar müsabakada kullanılan değildir, onlar motor anlatmak için kullanılan konum "arasındaki bu karakterler benim belgeli eski olan her şeyi." I "sonunda duyarsız olmak diyor bir desen düzenleyiciler olduğunu. Gerekli değil, Bir desen değiştirici neye benzediğini görebilirsiniz, ve ilk etapta sınırlayıcı neden ihtiyaç anlamanıza yardımcı olmak için bu yüzden ama ben burada bulunmaktadır.