Preg_match ve unicode kullanarak tuhaf hata

3 Cevap php
if (preg_match('(\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+)', '2010/02/14/this-is-something'))
{
  // do stuff
}

Yukarıdaki kod çalışır. Ancak bu bir değil.

if (preg_match('/\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+/u', '2010/02/14/this-is-something'))
{
    // do stuff
}

Belki birisi aşağıda biri çalışmıyor neden olarak bazı ışık tutabileceğini. Bu üretilmektedir hatadır:

Bir PHP hata ile karşılaşıldı

Önem: Uyarı

Message: preg_match() [function.preg-match]: Unknown modifier '\'

3 Cevap

modifier u is available from PHP 4.1.0 veya Unix üzerinde ve PHP 4.2.3 win32'de büyüktür.

Nvl gözlenen Ayrıca, sen sınırlayıcı olarak / kullanıyveyasanız ve regex / mevcut kaçan değildir. Yani you'lll kullanmak zveyaunda:

/\p{Nd}{4}\/\p{Nd}{2}\/\p{Nd}{2}\/\p{L}+/u

Eğer gibi sınırlayıcı farklı bir dizi kullanabilirsiniz kaçan Bunu önlemek için:

#\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+#

veya

@\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+@

As a tip, if your delimiter is present in your regex, its better to choose a different delimiter not found in the regex. This keeps the regex clean and shveyat.

Bu deneyin: (ile regex sınırlandırmak ())

if (preg_match('#\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+#', '2010/02/14/this-is-something'))
{
   // do stuff
}

Düzenlendi

İkinci regexdeki Eğer regex sınırlayıcı olarak / kullanıyorsanız, ama aynı zamanda regex kullanarak konum. Derleyici tam bir regex olarak bu bölümü yorumlamak için çalışıyor:

/\p{Nd}{4}/

Bu sonraki karakteri düşünüyor ikinci / 'u' veya 'm' gibi bir değiştirici olmalıdır, ancak bunun yerine bir ters eğik görür, bu yüzden bu şifreli istisna atar.

İlk regex size regex ayraç olarak parantez kullanarak konum; Eğer u değiştirici eklemek istedim, kapanış paren sonra vereceğini:

'(\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+)u'

Bu parantez veya diğer parentezleme karakterleri kullanmak için yasal olsa da ({}, [], <>) regex ayraç gibi, IMO iyi bir fikir değil. Çoğu insan az yaygın noktalama karakterlerden birini kullanmayı tercih. Örneğin:

'~\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+~u'

'%\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+%u'

Tabii ki, aynı zamanda ters eğik çizgi ile regex bölü kaçış olabilir, ama neden rahatsız?