Предупреждение: preg_match () [function.preg-match]: ошибка компиляции: нечего повторять со смещением - PullRequest
5 голосов
/ 16 апреля 2011

Я пытаюсь изменить проверку preg_match с проверки URL на проверку имени пользователя, которая является минимальной / максимальной 2-16chrs, тире, пробел и hypen приемлемо.Я получаю эту ошибку

Предупреждение: preg_match () [function.preg-match]: Ошибка компиляции: ничего не повторяется по смещению 14

if(empty($string) || preg_match("#^([\w- ]{2,16}*(?:.[\w- ]{2,16}*)+):?(d+)?/?#i", $string))

старый код, который ищет URL

if(empty($string) || preg_match("#^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?#i", $string))

Ответы [ 2 ]

8 голосов
/ 16 апреля 2011

Проблема здесь:

[\w- ]{2,16}*

Вы не можете использовать {2,16} и * вместе, вы можете использовать только один или другой.

Если вы хотите сопоставить группы от 2 до 16 [\w- ] с, хотя бы 0 раз, оберните его в подшаблон и прикрепите * снаружи:

(?:[\w- ]{2,16})*
1 голос
/ 16 апреля 2011

То, что BoltClock говорит, правильно. Но есть и другие проблемы с вашим регулярным выражением. Во-первых, чтобы решить вашу непосредственную проблему, вот регулярное выражение, которое проверяет имя пользователя длиной от 2 до 16 символов, состоящее только из букв, цифр, подчеркиваний, тире / дефисов и пробелов:

if (preg_match('/^[A-Za-z0-9_\- ]{2,16}$/', $string)) {
    // Valid username.
}

Обратите внимание, что в предложении 'empty() ||' нет необходимости, поскольку регулярное выражение совпадает только при наличии хотя бы двух символов.

Во-вторых, регулярные выражения очень полезны (и даже могут быть забавными! ), но если вы собираетесь их использовать, вам нужно сесть и изучить синтаксис, простой и понятный (это не так жесткий). Я настоятельно рекомендую потратить час или два на изучение основ. На сайте www.regular-expressions.info имеется отличное онлайн-руководство. Время, проведенное там, окупится много раз. Счастливое регулярное выражение!

...