Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
3 / 2 / 1
Регистрация: 27.12.2010
Сообщений: 31

Обработка адресов. Убрать все после "?"

23.09.2014, 17:34. Показов 3286. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача такая. Есть адрес вида: /news/novye-chekhly-dlya-iphone-4?clear_cache=Y
Нужно привести к: /news/index.php?CODE=$1 , где $1 - это все после слеша и до ?, в данном случае novye-chekhly-dlya-iphone-4.
Я пишу
PHP
1
preg_replace('#^/news/(.*)(\\?.*)#', '/news/index.php?CODE=$1', '/news/novye-chekhly-dlya-iphone-4?clear_cache=Y', -1, $count);
Срабатывает как нужно, но только при условии что есть только один дополнительный параметр, а мне нужно убирать их все
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.09.2014, 17:34
Ответы с готовыми решениями:

Убрать все до и после
Czech Republic - Ravak - Rosa 95 Нужно удалить все, что до "-" и после "-", т.е. остаться должно "Ravak" Также возможен такой...

Убрать всё из строки после определённого символа
Добрый день. Есть определёная строка. К примеру: Это обыкновенная строка, которую я решил привести в качестве примера #хэштег Мне...

Как убрать конфликт адресов
На физической машине ip 188.133.226.76 Установил Virtual PC, задал ip 188.133.226.77 Почему пишет конфликт ip адресов, как убрать, у...

9
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
23.09.2014, 18:40
http://php.net/manual/ru/function.strpos.php
http://php.net/manual/ru/function.substr.php
регулярки здесь лишние
0
3 / 2 / 1
Регистрация: 27.12.2010
Сообщений: 31
23.09.2014, 18:43  [ТС]
Увы, без регулярок не обойтись. preg_replace автоматически вызывается в битриксе при обработке адресов. На данный момент это единственный способ "обрезать" лишние параметры в _REQUEST
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
23.09.2014, 19:52
Цитата Сообщение от FinKeRosiN Посмотреть сообщение
но только при условии что есть только один дополнительный параметр, а мне нужно убирать их все
Что вы понимаете под словосочетанием "дополнительный параметр"? Приведите пример ссылки, которую Ваше регулярное выражение обрабатывает неверно.
0
3 / 2 / 1
Регистрация: 27.12.2010
Сообщений: 31
23.09.2014, 20:41  [ТС]
"?clear_cache=Y" вот что я понимаю под доп. параметрами.
Вообщем я поковырялся, и переделал регулярку. Сейчас проблема такая:
PHP
1
^/news/((.*)(\?(.*)))|(.*)
нужно сделать чтобы
PHP
1
(\?(.*))
повторялась 1+ раз
если верить википедии, то нужно сделать так:
PHP
1
^/news/((.*)(\?(.*))+)|(.*)
т.е. + добавить после группы, но что-то не сильно работает

Добавлено через 38 минут
Я кажется понимаю в чем трабла, но еще не знаю как решить
Вот результат с плюсом и без плюса. Нужно как-то сделать, чтобы обрезались все "дополнительные параметры", а не последний.


Не могу понять почему, если написать (\?(.*))+,то обрезается только последнее вхождение в строку,начинающееся с "?", а если написать (\?(.*))(\?(.*)), то оба. Видимо я очень плохо понимаю работу квантификатора "+". Тут проблема в том, что я не могу знать сколько будет вхождений (\?(.*))
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
23.09.2014, 22:10
Цитата Сообщение от FinKeRosiN Посмотреть сообщение
Я кажется понимаю в чем трабла, но еще не знаю как решить
Вот результат с плюсом и без плюса. Нужно как-то сделать, чтобы обрезались все "дополнительные параметры", а не последний.
https://monosnap.com/image/T8a... QdqtPDMX5T
https://monosnap.com/image/egH... 8G6Hyk3Fq1
А откуда у Вас такие ссылки? Вы в курсе что при GET запросе вопросительный знак (?) предшествует только первой GET переменный, остальные переменные отделяются знаками амперсанда (&). Правильные ссылки выглядят вот так:

google.ru/search?q=амперсанд&oq=амперсанд&aqs=chrome...

Ссылку в которой более одного вопросительного знака Вы не увидите, да и это неверно.

И Ваше регулярное выражение для правильных ссылок с GET запросом вполне подходит.

Если все-таки дело идет не о HTTP протоколе, то достаточного такого выражения:
Code
1
'#^/news/([^\?]+\??)#'
1
3 / 2 / 1
Регистрация: 27.12.2010
Сообщений: 31
23.09.2014, 23:11  [ТС]
тогда задача усложняется, но в любом случае
Code
1
'#^/news/([^\?]+\??)#'
не сработал
http://take.ms/3ynDX

Добавлено через 11 минут
одна из причин почему я это делаю:

Кликните здесь для просмотра всего текста

Одна интересная особенность, которую надо учитывать.

Допустим вам надо сделать преобразование такого вида, чтобы при открытии страницы /news/445.php происходило преобразование в /news/detail.php?ID=445
Можно использовать такое правило
Код
Code
1
2
3
4
5
array(
    "CONDITION"   => "#^/news/([0-9]+)\\.php#",
    "RULE" => "ID=$1",
    "PATH" => "/news/detail.php",
)

Оно даже будет работать, но ровно до тех пор пока в строке не появятся дополнительные параметры. Например пользователь перешел с внешнего ресурса и в URL была добавлена метка для Google Analitics, запрошенный URL получился примерно такой /news/445.php?utm_source=google. Вместо текста новости вы увидите сообщение "Элемент не найден", потому что в результате преобразования получился такой адрес /news/detail.php?ID=445?utm_source=google.

Ниже приведен код, решающий эту проблему:
Code
1
2
3
4
5
array(
    "CONDITION"   => "#^/news/([0-9]+)\\.php(\\?(.*))?#",
    "RULE" => "ID=$1&$3",
    "PATH" => "/news/detail.php",
)

Этот комментарий был на странице в разделе "обработка адресов" в документации к битриксу. Я настраивал ЧПУ через обработку адресов и столкнулся с проблеммой что при сбросе кэша у меня в _REQUEST передается не правильный CODE, т.к. к нему прибавляется "?clear_cache=Y". Тогда я начал думать о том чтобы разделить нужную мне информацию и все что идет за ней. С задачей обработки адресов при сбросе кэша я справился, но что делать если добавится еще метка, как в случае описанном выше?
0
3 / 2 / 1
Регистрация: 27.12.2010
Сообщений: 31
23.09.2014, 23:20  [ТС]
Как оно работает сейчас
Миниатюры
Обработка адресов. Убрать все после "?"  
0
Невнимательный
 Аватар для ft4l
2835 / 1261 / 357
Регистрация: 08.02.2013
Сообщений: 7,341
Записей в блоге: 2
24.09.2014, 05:07
Непонятно чем не устраивало предлогаемое
"CONDITION" => "#^/news/([0-9]+)\\.php(\\?(.*))?#",
"RULE" => "ID=$1&$3",
"PATH" => "/news/detail.php"
если тем что требует обязательного наличия цифр и '.php'
, то замените на "#^/news/([^\\?]+)(\\?(.*))?#"

Как оно работает сейчас
там с такой-же заменой ID=$1&$3 выражениие получает или только $1 или только $3
, причём в обоих случаях как-бы до возможного ?-символа.
//.... Если правильно смог рассмотреть картинку
1
3 / 2 / 1
Регистрация: 27.12.2010
Сообщений: 31
24.09.2014, 09:20  [ТС]
Предлагаемый пример вообще мне не подходит
А "#^/news/([^\\?]+)(\\?(.*))?#" не работает, я уже писал об этом и скрин присылал

Добавлено через 8 минут
Лол без понятия что произошло, но вчера регулярка #^/news/([^\\?]+)(\\?(.*))?# не сработала.
Только что снова ее вставил, даже автозаполнение в хроме подсказало что я уже писал это правило и оно сработало. Особая магия битрикса.
Всем спасибо за помощь.
Постараюсь не забыть и сделать итоговое сообщение с подведением результатов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2014, 09:20
Помогаю со студенческими работами здесь

Как убрать из строки все, что находится после тире
Добрый день хотелось бы спросить т.к не разу такое не делал..времени больно нет хочется уже быстрей .. в ListViewe есть Items'ы так...

Как корректно убрать расширения из адресов страниц
Добрый день. Собираюсь убрать расширения из адресной строки страниц сайта через htaccess RewriteCond %{REQUEST_FILENAME} !-f ...

Обработка несуществующих адресов сайта
Здравствуйте! У меня есть сайт mysite.ru. Открываются страницы как mysite.ru/page/ так и mysite.ru/____page/ ( но она должна выдавать...

Обработка списка адресов из текстового файла
Добрый день. Надо написать небольшой скрипт для отправки прайсов. Есть текстовый файл такого содержания ...

MVC: организация и обработка адресов для новостей
Добрый вечер! Допустим, есть контроллер news. У него есть два метода, list и one. Первый выводит все данные из MySQL с постраничной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru