[Регулярки & Mod_Rewrite] Задай вопрос, получи ответ.

Discussion in 'PHP' started by .:EnoT:., 19 Nov 2008.

Thread Status:
Not open for further replies.
  1. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    ты реально туп, приятель, еще бы мне тратить время на даунов всяческих

    Для обезьян:

    отдыхайте, молодой человек, нежно посасывая в уголке.

    ЗЫЖ Думай, потом пиши, дурачок:)
     
  2. Malunga

    Malunga New Member

    Joined:
    3 Sep 2008
    Messages:
    13
    Likes Received:
    2
    Reputations:
    0
    Ты в своём уме вообще?
    Одним флагом тут ничего не решается, так что ты снчала подумай, а потом печатай.
    А то складывается дурное впечатление о твоём профессионализме, дружок!
     
  3. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    Базар свой прекращаем, бабки! Сидят тут пальцы гнут друг перед другом.
    Вы оба не отличаетесь особым профессионализмом.
    Так что переносим споры в пм, аську, куда угодно, а тему оставляем для регулярок)
     
  4. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    delete
     
    #184 Pashkela, 12 Jan 2009
    Last edited: 16 Jan 2009
  5. jabber

    jabber New Member

    Joined:
    16 Jan 2009
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    MultiViews и mod_rewrite — два вопроса

    Постигая мудрость фреймворков, обнаружил невиданную ранее особенность:

    URL вида
    http://localhost/222/front .php
    работал также при добавлении в конец слеша и любого мусора
    http://localhost/222/front .php/dfojdofjso

    В моём представлении такой URL мог соответствовать исключительно одной ситуации — наличии каталога с именем front.php и файла без расширения с именем dfojdofjso.

    Озадаченный подобным казусом я полез на форум с вопросом «как такое может быть?». Мне сказали что дело в некой неизвестной мне тогда директиве MultiViews. Я обрадовался и закрыл тему, но поспешил. Оказалось, что эта директива всего лишь разрешает писать URL вида (1) вместо (2):

    1) http://localhost/222/front
    2) http://localhost/222/front .php

    А ссылка вида
    http://localhost/222/front .php/dfojdofjso
    cпокойно работает при отключённом MultiViews!!! Вот что печатает этот скрипт:

    REQUEST_URI => /222/front.php/dfdf
    SCRIPT_NAME => /222/front.php
    PHP_SELF => /222/front.php/dfdf
    SCRIPT_FILENAME => z:/home/localhost/www/222/front.php

    Я успокоил себя тем, что апач находит файл front.php и, рассудив, что это и есть его цель, выдаёт страницу. Т.е. поместил проблему в чёрный ящик.
    Далее я создал .htaccess с таким содержимым:

    RewriteEngine on
    RewriteRule ^(.*)$ front\.php/dfojdofjso [L]


    Т.е полагается переадресовывать любой запрос на front.php с мусором после слеша. Я ожидал один из двух вариантов:
    1) сработает, как и при вводе URL http://localhost/222/front.php/dfojdofjso
    2) не сработает и выдаст ошибку 404

    Далее я проверил URL:
    http://localhost/222/dfojdofjso.php
    но результат оказался иным — произошла 500-я ошибка, а по логам — зацикливание.

    Тут можно было бы обложится мануалами и разбираться в чём суть, но я продолжил эксперименты и получил во много раз более парадоксальную ситуацию. Изменённый .htaccess

    RewriteEngine on
    RewriteCond $1 !^front\.php
    RewriteRule ^(.*)$ front\.php/sdfsdf [L]


    И... это заработало. Заработало как в случае совпадения с front\.php, так и в случае несовпадения!

    1) http://localhost/222/front.php
    REQUEST_URI => /222/front.php
    SCRIPT_NAME => /222/front.php
    PHP_SELF => /222/front.php
    SCRIPT_FILENAME => z:/home/localhost/www/222/front.php

    2) http://localhost/222/dfojdofjso .php
    REQUEST_URI => /222/dfojdofjso.php
    SCRIPT_NAME => /222/front.php
    PHP_SELF => /222/front.php/sdfsdf
    SCRIPT_FILENAME => z:/home/localhost/www/222/front.php

    Т.е добавление условия заставило нерабочее правило работать как в случае выполнения условия (1), так и в случае невыполнения условия (2), чего, по идее, быть не может. Вообще, я предпочитаю разбираться во всём самостоятельно, однако данная ситуация разорвала мой мозг поэтому приходится просить помощи снова. Общее представление как работает mod rewrite я имею, поэтому прошу не отсылать меня к абстрактной документации.

    На всякий случай сформулирую вопросы:

    1) Как же всё-таки URL вида
    http://localhost/222/front.php/dfojdofjso
    при наличии файла front.php работает при отключённом MultiViews?

    2) Самый главный вопрос — почему правило

    RewriteEngine on
    RewriteRule ^(.*)$ front\.php/sdfsdf [L]


    вызывает зацикливание независимо от URL, а правило

    RewriteEngine on
    RewriteCond $1 !^front\.php
    RewriteRule ^(.*)$ front\.php/sdfsdf [L]


    не вызывает зацикливания, опять таки независимо от URL?

    Прошу прощения за длинный пост :)
     
    1 person likes this.
  6. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    http://htaccess.net.ru/doc/mod_rewrite/RewriteCond.php

    т.е. у тебя типо получается если НЕ " ^front\.php", то

    "^(.*)$" из строки "RewriteRule ^(.*)$ front\.php/sdfsdf [L]"

    а то, что справа от "^(.*)$" - просто игнорируется, я так понял

    ЗЫЖ Потому то, что справа от "^(.*)$" - ерунда какая-то:)
     
    1 person likes this.
  7. jabber

    jabber New Member

    Joined:
    16 Jan 2009
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    Думаю не игнорируется. Переменная PHP_SELF меняется в зависимости от выполнения, невыполнения условия.

    Я, пожалуй, переформулирую вопрос:

    Вот .htaccess фреймворка codeigniter

    RewriteEngine on
    RewriteCond $1 !^(index\.php|images|robots\.txt)
    RewriteRule ^(.*)$ index\.php/$1 [L]


    Т.е. всё кидаем на фронт контроллер кроме картинок, цсс-стилей и т.д. а также кроме самого фронт контроллера.
    Я не могу понять почему при удалении из RewriteCond составляющей "index\.php" происходит зацикливание на уровне Апача.

    Для чего это всё нужно. Обычно CMS/CMF перенаправляют составляющие URL в GET-параметры, но некоторые устроены иначе — к контроллерам доступаешься так:
    http://somehost.ru/index.php/somecontroller/action/param1/param2

    а чтобы не писать index.php, а писать так:
    http://somehost.ru/somecontroller/action/param1/param2

    в .htaccess и добавляют такое правило.

    Как оно распарсивается внутри, я пока не могу найти, там код мивина-стайл.
     
    #187 jabber, 16 Jan 2009
    Last edited: 16 Jan 2009
  8. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    jabber Как бы все интуитивно понятно должно быть:

    RewriteCond проверяет, чтобы первая подмаска не начиналась на index.php images или robots.txt. Если выполнено - вступает в силу RewriteRule - меняем http://someshit.ru/sdsadsadasd на http://someshit.ru/index.php/sdsadsadasd

    Так как произошел внутренний редирект, то данные условия проверяются еще раз, но уже для нового пути. Вот и получается бесконечное добавление index.php.

    Чтобы все было более явно - поставьте флаг для внешнего редиректа - R и посмотрите на урл в браузере после захода на страницу с RewriteRule и без оного

    Code:
    RewriteEngine on
    RewriteCond $1 !^(index\.php|images|robots\.txt)
    RewriteRule ^(.*)$ index\.php/$1 [L,R]
     
    _________________________
  9. Fak1r

    Fak1r Elder - Старейшина

    Joined:
    3 Jun 2007
    Messages:
    36
    Likes Received:
    2
    Reputations:
    0
    Есть несколько сторок текста:
    class="blu"><b>DATA</b></a>
    class="blu">DATA</a>
    class="blu"><b>DATA</b></a>
    class="blu">DATA</a>

    Нужно составить регулярку которая вытаскивает данные между тегами, в данном случае DATA.
     
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Fak1r
    PHP:
    preg_match_all('~class="blu">([^<])*</a>~i',$in,$out);
    print_r($out);
     
    _________________________
  11. Fak1r

    Fak1r Elder - Старейшина

    Joined:
    3 Jun 2007
    Messages:
    36
    Likes Received:
    2
    Reputations:
    0
    Gifts

    Чет не работает, проверял ругулярку на http://www.regexpr.ru/
    Возвращается только буква A, и только из двух сторочек в которых нет тэга <b>.
     
  12. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Fak1r * внутрь скобок надо ^^
    PHP:
     preg_match_all('~class="blu">([\s\S]*?)</a>~i',$in,$out);
    print_r($out);  
     
    _________________________
  13. Fak1r

    Fak1r Elder - Старейшина

    Joined:
    3 Jun 2007
    Messages:
    36
    Likes Received:
    2
    Reputations:
    0
    Опять же preg_match_all возвращает:

    Code:
    Array
    (
        [0] => Array
            (
                [0] => class="blu"><b>DATA</b></a>
                [1] => class="blu">DATA</a>
                [2] => class="blu"><b>DATA</b></a>
                [3] => class="blu">DATA</a>
            )
    
        [1] => Array
            (
                [0] => <b>DATA</b>
                [1] => DATA
                [2] => <b>DATA</b>
                [3] => DATA
            )
    
    )
    
     
     
    #193 Fak1r, 16 Jan 2009
    Last edited: 16 Jan 2009
  14. _evgeniy_

    _evgeniy_ Member

    Joined:
    7 Sep 2008
    Messages:
    25
    Likes Received:
    11
    Reputations:
    5
    PHP:
    $in '
    class="blu"><b>DATA</b></a>
    class="blu">DATA</a>
    class="blu"><b>DATA</b></a>
    class="blu">DATA</a>'
    ;

    preg_match_all('/>(.*?)</i',$in,$out);

    echo 
    '<pre>';
    print_r($out['1']);  
     
    2 people like this.
  15. jabber

    jabber New Member

    Joined:
    16 Jan 2009
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    Вот этого я не знал, поэтому вопрос и возник. Спасибо!
     
  16. OnArs

    OnArs Banned

    Joined:
    1 Aug 2008
    Messages:
    211
    Likes Received:
    13
    Reputations:
    1
    Здравствуйте!

    Есть строка в исходном коде страницы:
    <font color="#339966" size="+1">0.38 &nbsp; +

    Нужно парсить число, в данном случае 0.38.

    Делаю вот так:
    PHP:
    $html '<font color="#339966" size="+1">0.38 &nbsp; +';

    preg_match_all("/>(.*?) &nbsp;/i"$html$out);

    echo 
    '<pre>';
    echo 
    $out[0];
    Ничего не получаю в ответ, подскажите как сделать правильно и где ошибка?

    Большое Спасибо! :)
     
  17. [dei]

    [dei] Active Member

    Joined:
    24 Nov 2008
    Messages:
    171
    Likes Received:
    112
    Reputations:
    5
    сделай
    PHP:
    print_r$out ); 
    и поймешь что найденная подстрока лежит в $out[1][0] :)
     
    1 person likes this.
  18. OnArs

    OnArs Banned

    Joined:
    1 Aug 2008
    Messages:
    211
    Likes Received:
    13
    Reputations:
    1
    Чорт, точно. Значит регулярка правильная, большое спасибо! ;)
     
  19. Architek86

    Architek86 Elder - Старейшина

    Joined:
    20 Feb 2008
    Messages:
    80
    Likes Received:
    1
    Reputations:
    0
    Дан htaccess вот такого содержания:

    Code:
    RewriteEngine on
    RewriteBase /
    RewriteRule ^node/([0-9]+)([/]?)$ main.php?uri=$1
    т.е. все ссылки вида http://my.site.ru/node/ЧИСЛО/ обрабатываются через main.php.


    Как его дополнить так, что бы все остальные страницы, отличные от node/([0-9]+)([/]?), перенаправляли браузер на главную страницу http://my.site.ru/ ? Пробовал вот так:

    Code:
    RewriteEngine on
    RewriteBase /
    RewriteRule ^node/([0-9]+)([/]?)$ main.php?uri=$1 [L]
    RewriteRule ^(.*)$ http://my.site.ru/  [L]
    но Firefox ругаеццо на то, что сервер бесконечно редиректит и не может ничего выдать, т.е. данный пример не катит... Как быть? :rolleyes:
     
    #199 Architek86, 25 Jan 2009
    Last edited: 25 Jan 2009
  20. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Architek86

    Code:
    RewriteEngine on
    RewriteBase /
    RewriteRule ^node/([0-9]+)([/]?)$ main.php?uri=$1 [L]
    RewriteCond $1 !^main
    RewriteCond $1 !^node/([0-9]+)([/]?)$
    RewriteRule ^(.*)$ http://my.site.ru/ [R,L]
    
     
    _________________________
    #200 Gifts, 26 Jan 2009
    Last edited: 26 Jan 2009
Thread Status:
Not open for further replies.