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

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

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

    phpdreamer Member

    Joined:
    26 Jul 2009
    Messages:
    522
    Likes Received:
    86
    Reputations:
    19
    как то так
     
  2. Fepsis

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

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Всем привет!

    С модреврайтом дела иметь не приходилось, поэтому строго не судите...
    Ситуация следующая:

    Есть сайт http://site.ru, и страница на нём page.php.
    На этой странице информация выдаётся разная для разных регионов, необходимо, чтобы URL адреса для регионов были разные.. Например:

    http://site.ru/msk/page.php
    http://site.ru/spb/page.php
    http://site.ru/nnov/page.php

    Обрабатывается это всё так:

    Code:
    RewriteRule ^(msk|spb|nnov)/(.*)$ $2
    Тут всё отлично, работает как надо...

    Но вот задача, если пользователь зашёл напрямую на страницу http://site.ru/page.php, то его надо переадресовать на страницу, учитывая регион, например на http://site.ru/spb/page.php, если он из Питера... Регион определяется тоже нормально, и переадресация проходит, а вот с отображением страницы проблемы...
    Делаю так:
    Code:
    #	 Получаю из куков регион
    RewriteCond %{HTTP_COOKIE} region=([^;]+)
    
    #	Проверяю, нужно ли переадресовывать, то есть если REQUEST_URI начинается не с msk, nnov или spb, то переадресовываю...
    RewriteCond %{REQUEST_URI} !^/(msk|nnov|spb)
    
    #	Далее непосредственно переадресовываю
    RewriteRule (.*) http://site.ru/%1/$1
    
    #	И, наконец, обрабатываю ссылку, чтобы отображалось содержимое page.php
    RewriteRule ^(msk|spb|nnov)/(.*)$ $2
    
    Переадресация с http://site.ru/page.php на http://site.ru/[РЕГИОН]/page.php проходит успешно, но вот содержимое не отображается...
    Выдаёт 302 Found

    Code:
    Found
    
    The document has moved here.
    Подскажите, как лучше сделать..?!

    Заранее спасибо!
     
  3. -=Nikola=-

    -=Nikola=- New Member

    Joined:
    21 Oct 2011
    Messages:
    24
    Likes Received:
    3
    Reputations:
    0
    Помогите составить регулярку, есть текст, с этого текста нужно вытащить только три строки

    Server: idsoi.kos.ru
    login: lsdfr
    password: QgSuP4kt

    Вытащить надо то, что идет после
    Server:
    login:
    password:
     
  4. qaz

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

    Joined:
    12 Jul 2010
    Messages:
    1,551
    Likes Received:
    173
    Reputations:
    75
    PHP:
    preg_match("/Server:(.*?)\n/",$text);
    preg_match("/login:(.*?)\n/",$text);
    preg_match("/password:(.*?)\n/",$text);
     
    1 person likes this.
  5. DiffiT

    DiffiT Member

    Joined:
    15 Dec 2009
    Messages:
    195
    Likes Received:
    12
    Reputations:
    3
    Как через .htacess переписать запрос типа /img/a/b/c.jpg на /img/a_b_c.jpg ?
    При этом колличество слешей (вложенность) может меняться...
     
  6. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196
    Как составить регулярку, чтоб она брала подобное?
    [постоянная строка] [переменная строка, но не нужная] [постоянная строка]=[значение]

    делал так, но думаю, что это неэффективно, так как лишние данные берутся.
    PHP:
    preg_match_all('@lalala(.*?)data="(.*?)"@s'$b$c);
     
  7. Melfis

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

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    А какие данные то нужно брать? [значение]? Вообще желательно полный пример исходного текста (если таких строк несколько в $b, то и их привести)
     
  8. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196
    Да, [значение].
    Вот пример.

    PHP:
    <td class="link">
    blalala blalala blalala blalala
    blalala 
    data
    ={Нужная строка}
    lalalalalalalalalalalalalalalalalalalala
    lalalalalalalalalalalala

    lalalalalalalala

    lalalala
    </td>

    <
    td class="unlink">
    vhkjfsdhf h
    sdif soifos dhf
    sdfsdoifs

    data
    ={Нужная строка}
    </
    td>
    выбрать нужно {Нужная строка}

    Она встречается дважды и она одинаковая, но выбрать нужно ту, которая в блоке <td class="link"> ... </td>

    то есть по идее регулярка вроде такой должна быть, но она не сработает как нужно.

    @<td class="link">.*data=(.*?)</td>@

    В принципе, намного проще поступить вытащив тупо
    @data=(.*?)@ и потом от дублей избавится при помощи array_unique, но хочется путём наикратчайшим это сделать, то есть одной только регуляркой.
     
  9. Melfis

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

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Если на странице только одно значение надо брать(иначе preg_match_all), то вот регулярки:
    Более точная регулярка:
    preg_match('/class="link">.*?data=(.*?)\n/s', $cont, $match);
    print_r($match[1]);
    Можно такую, если перед нужной строкой точно не встретится data=
    '/data=(.*?)\n/s'

    Ps. .*? - знак вопроса задаёт нежадный режим поиска, тобишь ищет до элемента указанного после знака вопроса и сразу останавливается, а не до последнего найденного во всём контенте.
     
    #1769 Melfis, 1 Jun 2012
    Last edited: 1 Jun 2012
  10. alfi

    alfi New Member

    Joined:
    4 Mar 2012
    Messages:
    22
    Likes Received:
    1
    Reputations:
    0
    Может кто помочь с регуляркой для notepad++

    Есть база данных вида:
    фио:79151234567
    фио:791512
    :
    фио:9151234567
    фио:7915123456777
    :
    фио:79151234567
    фио:
    фио:
    фио:791512345

    Нужно удалить все лишние строки. Оставив лишь фио (как рус. так и анг. буквы) и номера от 10 до 11 цифр.
     
    #1770 alfi, 4 Jun 2012
    Last edited: 4 Jun 2012
  11. Melfis

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

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Code:
    \r\n.*?:(?:\d{1,9}|\d{12,}|\D|$)$
    Вроде должно работать. Не найдёт в первой строке ничего, так как для удобства поставил \r\n, чтобы сразу пустые строки убивались.
     
  12. Saint-Sky

    Saint-Sky Elder - Старейшина

    Joined:
    14 Jul 2007
    Messages:
    119
    Likes Received:
    77
    Reputations:
    27
    Ребята, выручайте с правилом(регуляркой) для .htaccess!

    Нужно, чтобы хосты с рефером вида "fvty67ri67f.com" или "56f5685jfgh.info"(домен из списка) посылались на статическую страницу /hren_vam.html

    Делаю так(раз спрашиваю - разумеется не пашет) -
     
  13. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Как составить регулрку, что бы функция preg_match() возвращала true если в строке НЕ ip адрес (IPv4) и false если в строке IP адрес и нечего лишнего?
     
  14. Melfis

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

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    $result = !preg_match("/^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$/", $str);
     
    1 person likes this.
  15. daniel777

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

    Joined:
    8 Jul 2010
    Messages:
    517
    Likes Received:
    90
    Reputations:
    37
    Как вариант можно использовать функцию filter_var с флагом FILTER_FLAG_IPV4.
     
    1 person likes this.
  16. Edward

    Edward Banned

    Joined:
    11 Feb 2010
    Messages:
    329
    Likes Received:
    21
    Reputations:
    -1
    Подскажите регулярку. В переменной у меня HTML код страницы. Нужно выдрать все ссылки, в атрибуте href которых только строка, начинающаяся на символ /, или не начинающаяся на символ /, но содержащая в себе домен моего сайта типа http://moisait.ru в начале.

    Заранее спасибо.
     
  17. mironich

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

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Это лучше дом парсером делать.
    Ибо изврат рег-ками такое делать.
     
  18. Edward

    Edward Banned

    Joined:
    11 Feb 2010
    Messages:
    329
    Likes Received:
    21
    Reputations:
    -1
    А как это на PHP реализовать ?
     
  19. mironich

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

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    http://simplehtmldom.sourceforge.net/
    Первый же пример.
     
  20. slider

    slider Reservists Of Antichat

    Joined:
    4 Sep 2005
    Messages:
    501
    Likes Received:
    711
    Reputations:
    748
    Может так!?

    PHP:
    preg_match_all('#<a.* href=.(/.*).>#U'$html$a);
    preg_match_all('#<a.* href=.(http://domain\.ru.*).>#U'$html$b);
    $links array_merge($a[1], $b[1]);

    print_r($links);
     
Thread Status:
Not open for further replies.