Sınırlayıcı alfasayısal veya ters eğik çizgi ve preg_match olmamalıdır


88

Bu koda sahibim:

$string1 = "My name is 'Kate' and im fine"; 
$pattern = "My name is '(.*)' and im fine"; 
preg_match($pattern , $string1, $matches);
echo $matches[1];

ve çalıştırdığımda şu hatayı döndürür:

Uyarı: preg_match () [function.preg-match]: Sınırlayıcı, alfasayısal veya ters eğik çizgi olmamalıdır


2
Başkalarına yardımcı olabilecek bir not olarak, tüm argümanlarınızı preg_match()değişkenler olarak aktarıyorsanız, değişkenlerin sırasını yanlışlıkla işlev çağrısında karıştırmadığınızdan emin olun, çünkü bu da neredeyse kesinlikle aynı sonuca neden olacaktır. görünen hata.
bluebinary


2
Kullanım$pattern = "/My name is '(.*)' and im fine/";
gk.

Yanıtlar:


134

Deseniniz için bir sınırlayıcıya ihtiyacınız var. Desenin başına ve sonuna şu şekilde eklenmelidir:

$pattern = "/My name is '(.*)' and im fine/";  // With / as a delimeter 

1
Normal ifade ifadelerini sıralamak için çift tırnak kullanmaya dikkat edin, aksi takdirde bazı \ + karakter kombinasyonları ( \lsatır beslemesi gibi) karakterlerine dönüştürülür ve bu da beklenenden farklı bir ifade üretebilir. Tek tırnak kullanın. Php Dizeleri açıklamasına bakın .
Patanjali

Bu örnekte, dize tek tırnak işaretleri içerdiğinden, onu kapatmak için çift tırnak kullanmak daha kolaydır ( \'tek tırnak içine alınmışsa gerekecek olan kaçıştan kaçınarak ).
Paul

Genel bir yorum yapıyordum, çünkü örnekleri görüntüleyen insanlar onları kendileri için 'çerez kesilecek' bir şey olarak kabul edebilirler, başka durumlara genişletirlerse ortaya çıkabilecek beklenmedik sonuçların farkına varmazlar. Maalesef yorumumu daha da spesifik olacak şekilde değiştiremiyorum.
Patanjali

68

Çözüm (diğer yanıtların bahsetmediği - en azından benim ilk yazdığım sırada), PHP sınırlayıcılara atıfta bulunduğunda, kodunuzda gördüğünüz sınırlayıcılara (tırnak işaretleri olan) değil, sonraki dizenin içindeki karakterler. (Aslında bunu herhangi bir belgede herhangi bir yerde belirtilmiş görmedim: bunu örneklerde görmelisiniz.) Bu nedenle, diğer birçok dilde alışık olabileceğiniz gibi düzenli bir ifade sözdizimine sahip olmak yerine:

/something/

PHP dizeleri kullanır ve sonra dizenin içinde başka bir sınırlayıcı arar :

'/something/'

PHP'nin atıfta bulunduğu sınırlayıcı, /karakter çifti yerine 'karakter çiftidir . Dolayısıyla, yazarsanız 'something', PHP shedeflenen sınırlayıcı olarak alacak ve sınırlayıcı olarak alfasayısal karakterleri kullanmanıza izin verilmediğinden şikayet edecektir .

Dolayısıyla, büyük / iküçük harfe duyarlı olmayan bir eşleşme istediğinizi göstermek için (örneğin) bir iletmek istiyorsanız, onu dizenin içine ancak normal ifade sınırlayıcılarının dışına iletirsiniz:

'/something/i'

/Sınırlayıcınız dışında bir şey kullanmak istiyorsanız, örneğin bir URL ile eşleşiyor ve tüm eğik çizgileri atlamak zorunda kalmak istemiyorsanız yapabilirsiniz:

'~something~'

1
@Gruber: teşekkürler! her zaman tüm arkadaşlarınıza bağlantılarını gönderebilir ve onlara oy vermelerine izin verebilirsiniz;)
iconoclast

1
Hangi belgelerin açıklamadığını açıklamak .. +1 Teşekkürler!
Ju Oliveira

En yüksek oy alan cevap bununla aynıdır, ancak bunun neden doğru cevap olduğunu şimdi anladığım için minnettarım . +1 Teşekkürler!
Eklektik

21

İfadeniz için bir sınırlayıcı belirtmelisiniz. Sınırlayıcı, ifadenizin hangi kısmının ifade olduğunu belirtmek için ifadenizin başında ve sonunda kullanılan özel bir karakterdir. Bu, değiştiricileri ve yorumlayıcının hangisinin bir ifade ve hangilerinin değiştirici olduğunu bilmesini sağlar. Hata mesajında ​​belirtildiği gibi, ayırıcı ters eğik çizgi olamaz çünkü ters eğik çizgi kaçış karakteridir.

$pattern = "/My name is '(.*)' and im fine/";

ve aynı örneğin altında, ancak ibüyük / küçük harfe duyarlı olmadan eşleşecek değiştiriciyle.

$pattern = "/My name is '(.*)' and im fine/i";

Gördüğünüz gibi i, eğik çizgilerin dışında ve bu nedenle bir değiştirici olarak yorumlanıyor.

Ayrıca, sınırlayıcı olarak eğik çizgi (/) kullanırsanız, varsa, normal ifadede diğer kullanımlardan kaçınmanız gerektiğini unutmayın.


7

Desende sınırlayıcılar olmalıdır. Sınırlayıcılar eğik çizgi (/) veya alfanümerik olmayan herhangi bir karakter (#, $, *, ...) olabilir. Örnekler

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";  


0

Orijinal kod örneğiyle ilgili olmayabilir, ancak "Sınırlayıcı alfasayısal veya ters eğik çizgi olmamalıdır" hatasını aldım ve burada Google'da arandı. Sebep: preg_match için sıralı parametreleri karıştırdım. Desen ikinci parametredir ve eşleşecek dize ilkti. Dikkatli ol :)


-2

Lütfen bununla dene

 $pattern = "/My name is '\(.*\)' and im fine/"; 

Neden parantezlerden kaçılsın?
Ki Jéy

1
@kiJey. OP'nin durumunda, adı çıkarmak istediler, bu nedenle eşleşme için parantezler gerekli ve bu nedenle kaçılmamalıdır. Bu yüzden olumsuz oy kullanıyorum.
Patanjali
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.