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

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

Thread Status:
Not open for further replies.
  1. N@b$ter

    N@b$ter Elder - Старейшина

    Joined:
    6 Oct 2009
    Messages:
    293
    Likes Received:
    73
    Reputations:
    21
    Большое человеческое спасибо)
     
  2. Edward

    Edward Banned

    Joined:
    11 Feb 2010
    Messages:
    329
    Likes Received:
    21
    Reputations:
    -1
    Здравствуйте, имеется участок кода:

    HTML:
    <table rel="850" border="0" cellpadding="1" cellspacing="3" style="border: 1px solid #000000; background-color: transparent; width: 180px;">
    <tbody>
    <tr>
    <td valign="top" align="center" width="100%">
    <center>
    <a href="http://site.net/got.php?l=dWlkPTE3MzQzNDEzNzYmaWQ9NDc0NzEmdGlkPTQyODQ5MSZwYz1qeUVoaU5aUHJyJnQ9MiZibnVtPVVDNGFBNFdXdG1Vc2pVUTk5V2tkJmJpZD03OTQzNiZtYz1hNzRmY2ZiZjA0N2RlZGYyZDA2NmIzNWM5N2E3MDM1ZCZwb3M9MSZzZXNzPTRiMWZkZjQ0NzQwMjg4NGE3NTgyMTdiZDkwYmMzODlmJnRpZj0xJnJlZjE9JnRiPVtSRUZd" onclick="this.setAttribute(\'href\', __bodyHandler(this.href, event, 52279));" onmouseover="document.getElementById(\'url1905029050428491\').style.color=\'171717\'; document.getElementById(\'url1905029050428491\').style.textDecoration=\'underline\';return true" onmouseout="document.getElementById(\'url1905029050428491\').style.color=\'\';document.getElementById(\'url1905029050428491\').style.textDecoration=\'\';return true" target="_blank">
    <img class="newsimg" src="http://me148.img-giganto.net/i/14560/v7GZ5vI2tMV5PNP.jpg" target="_blank" width="170" height="170" alt="текст" title="текст">
    </a>
    <br> 
    <div style="display: block; padding-top: 5px">
    <a class="linkt" href="http://site.net/got.php?l=dWlkPTE3MzQzNDEzNzYmaWQ9NDc0NzEmdGlkPTQyODQ5MSZwYz1qeUVoaU5aUHJyJnQ9MiZibnVtPVVDNGFBNFdXdG1Vc2pVUTk5V2tkJmJpZD03OTQzNiZtYz1hNzRmY2ZiZjA0N2RlZGYyZDA2NmIzNWM5N2E3MDM1ZCZwb3M9MSZzZXNzPTRiMWZkZjQ0NzQwMjg4NGE3NTgyMTdiZDkwYmMzODlmJnRpZj0xJnJlZjE9JnRiPVtSRUZd" onclick="this.setAttribute(\'href\', __bodyHandler(this.href, event, 52279));" target="_blank" id="url1905029050428491">текст</a>  </div>
    </center>
    </td>
    </tr>
    ...
    </tbody>
    </table>
    
    и так несколько подряд идущих блоков <tr>. Нужно достать все значения атрибута href, тега a. Т. е. в данном примере строку http://site.net/got.php?l=dWlkPTE3MzQzNDEzNzYmaWQ9NDc0NzEmdGlkPTQyODQ5MSZwYz1qeUVoaU5aUHJyJnQ9MiZibnVtPVVDNGFBNFdXdG1Vc2pVUTk5V2tkJmJpZD03OTQzNiZtYz1hNzRmY2ZiZjA0N2RlZGYyZDA2NmIzNWM5N2E3MDM1ZCZwb3M9MSZzZXNzPTRiMWZkZjQ0NzQwMjg4NGE3NTgyMTdiZDkwYmMzODlmJnRpZj0xJnJlZjE9JnRiPVtSRUZd

    НО только те ссылки, которые внутри тегов <table><center> дерева, остальные не нужно. Спасибо
     
  3. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Регулярное выражение

    Всем Доброго дня!

    Есть такая строка кода:

    HTML:
    ITowns.initialize({"groups":null,"towns":[{"id":80121,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-01","island_x":732,"island_y":694,"plenty":"wood","r are":"stone","has_conqueror":false,"researches":{"berth" :true,"conscription":true,"mathematics":true},"favor":500},{"id":78218,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-02","island_x":716,"island_y":708,"plenty":"iron","rare":"wood","has_conqueror":fal se,"researches":{"berth":true,"conscription":true,"mathematics&quo t;:true},"favor":500},{"id":57664,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-03","island_x":681,"island_y":706,"plenty":"stone","rare":"wood","has_conqueror":fa lse,"researches":{"berth":true,"conscription":true,"mathematics&qu ot;:true},"favor":500},{"id":46826,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-04","island_x":679,"island_y":703,"plenty":"iron","rare":"wood","has_conqueror":fal se,"researches":{"berth":true,"conscription":true,"mathematics&quo t;:true},"favor":500}.....
    Из этой строки мне нужно выдернуть значения ID и NAME, перекодировать значение NAME в кириллицу и сохранить эти значения в переменные, для дальнейшего использования...

    Не пойму как составить регулярку, потому что весь код огромный. "id" и "name" встречается огромное количество раз, а мне нужно выдернуть значения именно из этой строчки...
     
  4. LStr1ke

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

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73
    Убери лишнее. и примени php unserialize();
     
  5. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    как-то это слишком сложно! А через preg_match_all нельзя?
     
  6. .vk

    .vk Banned

    Joined:
    5 Feb 2012
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    А как убрать лишнее?
    Например у меня есть

    PHP:
    ve 4v 0e6rv40w6erv4e6w1 >23fRQQ>@3<div class="name">Textte
    xte
    (texxtt)</div>ve 4v 0e6rv40w6erv4e6w1 >23fRQQ>@3<div class="msg">exttexteexttexte</div>ve 4v 0e6rv40w6erv4e6w1 >23fRQQ>@3ve 4v 0e6rv40w6erv4e6w1 >23fRQQ>@3
    <div class="name">Texttexte(texxtt)</div>ve 4v 0e6rv40w6erv4e6w1 >23fRQQ>@3<div class="msg">exttexteexttexte</div>ve 4v 0e6rv40w6erv4e6w1 >23fRQQ>@3
    Нужно оставить только то что находится в тегах div (и сами теги)
    PHP:
    <div class="name">Textte
    xte
    (texxtt)</div>
    <
    div class="msg">exttexteexttexte</div>
     
  7. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    В общем при помощи preg_match('#ITowns.initialize(.+)#', $ans, $vilages);
    я забираю нужную мне строку в переменную.

    Потом используя
    PHP:
    $m explode(','$vilages[0]);
    foreach(
    $m as $v)
    {
        if(
    $p strpos($v'id'))
        {
            
    $id[] = substr($v,$p+4);
        }
        elseif(
    $p strpos($v'name'))
        {
            
    $name[] = substr($v,$p+6);
        }
    }

    echo 
    '<br><br><pre>';
    print_r($id);
    echo 
    '<br><br>';
    print_r($name);
    echo 
    '</pre>';
    выбираю нужные значения.
    $name выбирается правильно, а вот $id нет.

    Создается массив из 4-х элементов... Три из которых мне вообще не нужны... Нужен только первый элемент...

    HTML:
     Array
    (
        [0] => 51543
        [1] => e left\">\n\t
    \n\t\t
    \n\t\t
    <\/div><%\n\t\tvar active_group_id = ITowns.getActiveTownGroup().id
        [2] => 
        [3] => n groups) {\n\t\t\t\tif (groups.hasOwnProperty(id) && parseInt(id
        [4] => = \"0\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\n\t\t\t\tsorted_list = ITowns.getSortedTownGroupMapByName(group.id);\n\t\t\t\t%>\n\n\t\t\t\t
     <%= cssClass %>\">\n\t\t\t\t\t
    \n\t\t\t\t\t\t<%= (group.id === null ? msg_keine_gruppe : group.name ) %><\/a>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t
    \" class=\"town_group\">\n\t\t\t\t\t\t<% for (i = 0
        [5] => "g<%= id %>_splitted<%= splitted %>\" class=\"town_group\">\n\t\t\t\t\t\t\t<%}%>\n\n\t\t\t\t\t\t\t
    \">\n\t\t\t\t\t\t\t\t\"><%= ITowns.getTown(town.id).name %><\/a>\n\t\t\t\t\t\t\t\t<% if (group.id !== null) { %>\n\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<% } %>\n\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<% } %>\n\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t<% }\n\t\t%><\/div>\n\t<\/div>\n<\/div>\n
    \n\t
    \n\t\t
    <\/div>\n\t<\/div>\n<\/div>"});
    )
    Как же правильно сделать выборку?
     
  8. Melfis

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

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Seganapa, регулярка тут вообще не нужна.json в php
     
  9. Seganapa

    Seganapa New Member

    Joined:
    8 Jun 2012
    Messages:
    74
    Likes Received:
    0
    Reputations:
    0
    Да, json_decode мне бы здорово помог...
    Только вот не могу разобрать как при помощи него получить массив с данными,т.е. как для каждого значения получить переменную?
     
  10. Melfis

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

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Блин, ну так лень почитать то, что я скинул что ли? Расписано же.
    PHP:
    $data json_decode($jsontrue);
    $towns $data['towns'];
    for (
    $i 0$i count(towns); $i++) {
    $town $towns[i];
    echo 
    "Town name is "$town['name'] .",  town id is "$town['id'] ."\n";
    }
    Код не тестил, но по идее должно работать. Если будут ошибки, то оставляю их исправление на тебя.
     
  11. Dr.Strangelove

    Joined:
    1 Dec 2008
    Messages:
    111
    Likes Received:
    61
    Reputations:
    -6
    Помогите написать регулярное выражение. В Smarty есть функция модификатор regex_replace, которая принимает регулярку. Так вот нужно регулярное выражение которое очистит html код от всех тегов, кроме <div>,<a>,<ul>,<li>.
    Чтобы остался лишь текст и кусок кода типа такого

    Code:
    <div style="display:none"><ul><li><a href="http://somehost.com/">link</a></li><li><a href="http://somehost.com/">link</a></li></ul></div>
    Очистка от всех тегов будет выглядеть там примерено так :

    Code:
    {$data|regex_replace:"/<.*?>/ ":""|truncate:500:"...":false:true|replace:']]>':''}

    Но как сделать чтобы не трогало теги <div>,<a>,<ul>,<li>. и аналогичные закрывающие?


    p.s. Сам спросил, сам ответил. Проблему решил путем модификации плагина Smarty. (Smarty strip_tags modifier plugin). Но из любопытства вопрос о регулярке остается в силе.
     
    #1811 Dr.Strangelove, 14 Jul 2012
    Last edited: 14 Jul 2012
  12. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Есть домен 123.com. Нужно сделать такой редирект:

    123.com/abc чтобы переходило на 123.com/1.php?abc

    Но чтобы некоторые файлы (например index.php, admin.php) НЕ подходили этому правилу, то есть чтобы запрос 123.com/index.php никак не трансформировался.

    Помогите плс.
     
  13. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Имеем строку :
    tatu-mashinka-induktsionnaya-ID4mvTT.html#94f3c0e2;r:20;s:
    как вытащить: ID4mvTT ?
     
  14. mironich

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

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    tatu-mashinka-induktsionnaya-([a-zA-Z\d]*)\.
     
  15. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    tatu-mashinka-induktsionnaya- меняется каждый раз. Количество слов, разделенных дефисами тоже разное...
     
  16. Skofield

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

    Joined:
    27 Aug 2008
    Messages:
    960
    Likes Received:
    392
    Reputations:
    58
    shadowrun
    PHP:
    preg_match("~-(\w+)\.html~U"$str$match);
     
    #1816 Skofield, 15 Jul 2012
    Last edited: 16 Jul 2012
    1 person likes this.
  17. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Есть домен 123.com. Нужно сделать такой редирект:

    123.com/abc чтобы переходило на 123.com/1.php?abc

    Но чтобы некоторые файлы (например index.php, admin.php) НЕ подходили этому правилу, то есть чтобы запрос 123.com/index.php никак не трансформировался.

    Помогите плс.
     
  18. .Varius

    .Varius Elder - Старейшина

    Joined:
    5 May 2009
    Messages:
    558
    Likes Received:
    289
    Reputations:
    42
    qbz

    RewriteEngine On
    Options +FollowSymlinks
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !index.php|1.php|admin.php [NC]
    RewriteRule ^(.+)$ 1.php?$1 [L]
     
    1 person likes this.
  19. .vk

    .vk Banned

    Joined:
    5 Feb 2012
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    ....
     
  20. mironich

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

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Code:
    [B].vk[/B], <div class="name">[\s.]*<div
     
Thread Status:
Not open for further replies.