PHP регулярное выражение странное поведение

1

Я разрабатывал простое регулярное выражение для анализа части URL-адреса, регулярное выражение должно уметь фиксировать часть URL-адреса в именованной группе, есть только несколько допустимых символов (a-z0-9 и -), если присутствуют другие символы regexp должен терпеть неудачу для данной строки, и захват не будет выполнен.

Но, как вы можете видеть на скриншоте, когда регулярное выражение обнаруживает знак%, он останавливается и захватывает часть перед ней (если она длиннее двух символов), результат остается без границ слов (\ b).

Я не могу понять, почему% действует как \n, и движок захватывает предыдущие символы и останавливает% не в разрешенном списке символов, поэтому он должен терпеть неудачу для этой строки... или нет?

Я тоже пробовал в реальном PHP-коде, с тем же результатом.

Изображение 174551

ИЗМЕНИТЬ 1:

Фактический код PHP:

if (preg_match('/fixed_url_part/\b(?P<codename>[a-z0-9-]{2,})\b', $url, $regs)) {
    return $regs['codename'];
}
  • 2
    Точный код в вопросе будет полезен. Похоже, что ваш заполнитель просто ищет буквенно-цифровые символы, за исключением % .
  • 0
    Я отредактировал ответ с помощью кода, но суть в том, почему с% он захватывает предыдущие символы и с, например, _ в строке, он терпит неудачу? почему не с ошибкой%?
Показать ещё 2 комментария
Теги:

1 ответ

3
Лучший ответ

Вы не сказали, чтобы он соответствовал всей линии. Добавьте $ чтобы он соответствовал концу.

^/fixed_url_part/\b(?P<codename>[a-z0-9\-]{2,})\b$
^-- match start of line                          ^-- match end of line
  • 1
    держать - также в группе, как хочет ОП.
  • 0
    Я также добавил бы ^ , на всякий случай. (Я полагаю, что abc/fixed_url_part/def должен потерпеть неудачу.)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню