- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Тренды маркетинга в 2024 году: мобильные продажи, углубленная аналитика и ИИ
Экспертная оценка Адмитад
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Коллеги,
Никак не могу понять, как посредством регулярного выражения решить следующую задачу:
Пользователь вводит адрес страницы вида foo/bar.
Эти URI я проверяю на разрешенные символы [a-z0-9_\-/]+.
Кроме того необходимо отсечь URI, начинающиеся с подстроки admin.
По логике нужно что-то вроде (?<!admin)[a-z0-9_\-/]+
Однако ожидаемого Nope нижеприведенный код не выдает.
Аналогичная «позитивная» проверка (?<=) работает, как ожидается. ЧЯДНТ?
а так не проще ?
Негативная проверка подразумевает что у Вас не находится НИ ОДНОГО варианта который удовлетворял бы регу. А поскольку у Вас во второй части ( a-z0-9_\-/ ) множество в которое может войти очень много, в том числе ВСЁ выражение, то тут и вылезает ошибка.
Что убедится в этом, достаточно написать "#(?<!admin)([a-z0-9_\-/]+)#"
И сразу будет наглядно видно, что под условие [a-z0-9_\-/]+ попадает всё выражение целиком admin/test, ПЕРЕД которым действительно НЕТУ слова admin.
В Вашей ситуации вполне может подойти вариант
#(?<!admin)/([a-z0-9_\-/]+)#
Или что еще проще и правильнее (раз Вам нужно проверить только начало строки), просто проверяйте substr($url,0,5)!='admin'
И конечно надо помнить, что $_SERVER['REQUEST_URI'] обычно выглядит как /admin/test, а не как admin/test как в Вашем тестовом примере.
И еще момент, если Вы проверяете урл по $_SERVER['REQUEST_URI'], то не забывайте, что вызов например ad%6Din.php у Вас вызовет admin.php, но при этом в $_SERVER['REQUEST_URI'] у Вас не будет слова admin.
Проще, но мне нужно именно цельное выражение с отрицанием, чтобы запихнуть в Regeх-валидатор. Ну и сама матчасть интересна.
Будьте проще :) В одной регулярке проверяйте на разрешённые символы, во второй - на вхождение подстроки admin (наверное даже лучше с помощью strpos).
Никогда не парюсь, если можно просто разбить задачу на 2 элементарных, пусть 2 действия, зато придумывается за секунды и без рысканья по мануалам.
З.Ы. Пока писал - Вы все опередили :)
edogs, благодарю. Стало понятнее.