Странная ошибка при использовании preg_match и unicode - PullRequest
0 голосов
/ 09 марта 2010
if (preg_match('(\p{Nd}{4}/\p{Nd}{2}/\p{Nd}{2}/\p{L}+)', '2010/02/14/this-is-something'))
{
  // do stuff
}

Приведенный выше код работает. Однако это не так.

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

Может быть, кто-то мог бы пролить свет на то, почему не работает приведенная ниже Это ошибка, которая выдается:

Обнаружена ошибка PHP

Серьезность: Предупреждение

Сообщение: preg_match () [function.preg-match]: неизвестно модификатор '\'

Ответы [ 3 ]

1 голос
/ 09 марта 2010

Попробуйте это: (разделите регулярное выражение с ())

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

Отредактировано

0 голосов
/ 09 марта 2010

Во втором регулярном выражении вы используете / в качестве разделителя регулярных выражений, но вы также используете его в регулярном выражении. Компилятор пытается интерпретировать эту часть как полное регулярное выражение:

/\p{Nd}{4}/

Он думает, что следующий символ после второго / должен быть модификатором, таким как 'u' или 'm', но вместо этого он видит обратную косую черту, поэтому он создает это загадочное исключение.

В первом регулярном выражении вы используете круглые скобки в качестве разделителей регулярных выражений; если вы хотите добавить модификатор u, вы поместите его после закрывающей скобки:

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

Хотя в качестве разделителей регулярных выражений допустимо использовать скобки или другие символы в скобках ({}, [], <>), это не очень хорошая идея IMO. Большинство людей предпочитают использовать один из менее распространенных знаков препинания. Например:

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

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

Конечно, вы также можете избежать косой черты в регулярном выражении с помощью обратной косой черты, но зачем беспокоиться?

0 голосов
/ 09 марта 2010

modifier u доступно из PHP 4.1.0 или выше для Unix и из PHP 4.2.3 для win32.

Также, как заметил nvl, вы используете / в качестве разделителя и не экранируете / присутствует в регулярном выражении. Так что вам придется использовать:

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

Чтобы избежать этого, вы можете использовать другой набор разделителей, например:

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

или

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

В качестве подсказки, если в вашем регулярном выражении присутствует ваш разделитель, лучше выбрать другой разделитель, которого нет в регулярном выражении. Это делает регулярное выражение чистым и коротким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...