За последние 24 часа нас посетили 17869 программистов и 1654 робота. Сейчас ищут 1678 программистов ...

Разбор URL строки каталога

Тема в разделе "Регулярные выражения", создана пользователем Andrey_Sergeev, 17 дек 2008.

  1. Andrey_Sergeev

    Andrey_Sergeev Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    8
    Симпатии:
    0
    Думаю многим приходилось сталкиваться с древовидной структурой каталогов. (http://сайт.ру/раздел1/раздел2/раздел3/…/разделN/). Все в общем то по стандарту. Но проблема возникает, когда к этому пути я хочу добавить параметр, отвечающий за номер страницы. То есть, скажем, вот так / раздел1/раздел2/раздел3/…/разделN/страница_1/.

    Мне надо чтобы с помощью регулярных выражений я получал полный путь (/раздел1/раздел2/раздел3/…/разделN/) и номер текущей страницы (1).

    Сейчас я использую вот такую конструкцию, она вполне справляется с поставленной задачей. /(.*)/(страница_([0-9]))/* На выходе получается массив с элементами

    Group 1: раздел1/раздел2/раздел3/…/разделN
    Group 2: страница_2
    Group 3: 2

    Но возможны варианты, когда параметр с номером страницы отсутствует. То есть, вот так (/раздел1/раздел2/раздел3/…/разделN/). Тогда приведенный мой пример попросту не работает.

    Как построить эффективное регулярное выражение, учитывающее эту особенность?
     
  2. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    раздел1/раздел2/раздел3/…/разделN/(страница_1/)?

    ? - ноль или 1 совпадние

    а вообще тут еще можно explode(), если не mod rewrite канеш...
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Andrey_Sergeev
    господи, надеюсь у вас mod_rewrite...
    ну вообщем-то, для таких дел делается 2 регулярных выражения
    Код (Text):
    1. RewriteRule ^(.+)\/page-([0-9]+)\/$ index.php?dir=$1&page=$2 [L]
    2. RewriteRule ^(.+)\/$ index.php?dir=$1&page=0 [L]
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    это если Апач стоит, а если нет?
    =)
    я вот давно уже под Апачем не работаю.
     
  5. +1
     
  6. Andrey_Sergeev

    Andrey_Sergeev Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    8
    Симпатии:
    0
    А есть варианты при которых эти 2 выражения соединены в одно? Дело в том что мне нужно, чтобы одним регулярным выражением обрабатывались 2 случая.

    Эта обрабтка испольуется не в mod_rewrite. Он тут совершенноне причем.
     
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    А если php сломалсо? :)
    я бы никогда не променял mod_rewrite на mkdir
    В виде чего нужно получить результат?
    вообще preg_match, preg_match_all, preg_replace ...
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а как оно связано?
    =)
     
  9. 440Hz, босс, ты на чем, на нгинксе, али на лайти?
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ну некоторые любют папочки клепать...
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Код (Text):
    1.  
    2. master(root):/usr/www/go.trafficshop.com/bin#>ps ax | egrep "(php|nginx)"
    3.  3199  ??  I      0:14.94 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    4.  3319  ??  I      0:15.87 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    5.  4293  ??  I      0:15.34 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    6.  4429  ??  I      0:14.72 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    7.  5519  ??  I      0:14.92 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    8. 24752  ??  Is     0:00.00 nginx: master process /usr/local/sbin/nginx
    9. 24753  ??  S      0:07.35 nginx: worker process (nginx)
    10. 64557  ??  Is     0:00.19 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    11. 86974  ??  I      0:13.91 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    12. 86975  ??  I      0:14.70 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    13. 89516  ??  I      0:14.30 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    14. 89650  ??  I      0:14.61 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    15. 95761  ??  I      0:16.25 /usr/local/bin/php-cgi -b /tmp/.fastcgi.www/socket
    16. 46180  p0  R+     0:00.00 egrep (php|nginx)
     
  12. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    не. как связан в твоем понимании mod_rewrite и mkdir ?
     
  13. Andrey_Sergeev

    Andrey_Sergeev Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    8
    Симпатии:
    0
    Результаты нужны в виде массива

    Array
    (
    [0] => /sub1/sub2 - путь
    [1] => 2 - номер страницы (если она присутствует в строке URL)
    )

    функция обработки может быть любой. к примеру preg_match_all
     
  14. 440Hz, без php-fpm ?
     
  15. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    без. а оно надо?
    =)
     
  16. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    вот в моём понимании - никак, а в понимании некоторых, mkdir весело клепает папочки и получает ЧПУ
    Слу, ты же понимаешь о чём я, чё меня мучиишь =\
     
  17. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ну с такими я вообще предпочитаю не общаться. мозги дороже.
     
  18. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а я не могу так просто смотреть как человек уродует программу...=(
     
  19. Andrey_Sergeev

    Andrey_Sergeev Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    8
    Симпатии:
    0
    Еще раз возврашаясь к моей проблеме. http://site.ru/sub1/sub2/.../sub3/ или http://site.ru/sub1/sub2/.../sub3/page_3/

    Насколько я понимаю все дело в конструкции (.*) , которая выбирает все символы из строки. И в том числе символ / .

    Можно ли ее видоизменить, чтобы внести ограничения на жестко заданное слово (к примеру page_) .

    А далее уже применять выражения типа (page_[0-9])? Или все же существует метод получить массив из 2-х элементов?

    подскажите кто знает, буду очень признателен
     
  20. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Код (Text):
    1. #(.+)\/(?:page_([0-9]+)\/)?$#iU
     
  21. Andrey_Sergeev

    Andrey_Sergeev Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    8
    Симпатии:
    0
    Во большое спасибо. Отличный совет теперь все работает!