Регулярные выражения: выбрать из html кода все картинки за исключением первой

Discussion in 'PHP' started by kof, 14 Feb 2010.

  1. kof

    kof New Member

    Joined:
    1 Jul 2006
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Вобщем по сабжу - если такое возможно сделать одним-двумя регулярными выражениями то прошу пример.

    Подробно: есть файл html из которого нужно вырезать (убрать) все картинки за исключением первой. Нужно реализовать только с использованием регулярного выражения (или двух).

    UPD: Я не могу редактировать php код, но я могу отредактировать регулярное выражение которое вырезает текст.
     
    #1 kof, 14 Feb 2010
    Last edited: 14 Feb 2010
  2. Chaak

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

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    unset($massiv[0]);
     
  3. vvy

    vvy New Member

    Joined:
    29 Mar 2009
    Messages:
    33
    Likes Received:
    3
    Reputations:
    4
    Универсальный вариант (за оптимальность не ручаюсь)
    Code:
    var dell=false;
    var reg=/<img[^>]*>/gi;
    function replacer(str, p1, p2, offset, s)
    {
    if (!dell) { dell=true; return str;}
    	else return '';
    }
    var new_body=document.getElementsByTagName('body')[0].innerHTML.replace(reg,replacer);
    document.getElementsByTagName('body')[0].innerHTML=new_body;
    
    Мне кажется так будет лучше, но надо дописать регулярку reg так, что б она просто не сработала на первую картинку
    Code:
    var reg=/<img[^>]*>/gi;
    var new_body=document.getElementsByTagName('body')[0].innerHTML.replace(reg,'');
    document.getElementsByTagName('body')[0].innerHTML=new_body;
    
     
  4. kof

    kof New Member

    Joined:
    1 Jul 2006
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Я не могу редактировать php код, но я могу отредактировать регулярное выражение которое вырезает текст. В топике сказано возможно-ли ТОЛЬКО регулярным выражением это сделать или нет.
     
  5. kof

    kof New Member

    Joined:
    1 Jul 2006
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    vvy: именно регулярным выражением могу пользоваться, никакого яваскрипта и пхп не могу использовать, тоесть есть php-код в котором я могу изменить лишь регулярное выражение, а сам код изменять не могу. вот такой ребус. :(
     
  6. vvy

    vvy New Member

    Joined:
    29 Mar 2009
    Messages:
    33
    Likes Received:
    3
    Reputations:
    4
    kof, а чем тебе это не вариант с регулярными выражениями? 0_о переведи на php и все.

    ЗЫ А вобщето язык можно было бы и в первом посте написать.....
     
    #6 vvy, 14 Feb 2010
    Last edited: 14 Feb 2010
  7. kof

    kof New Member

    Joined:
    1 Jul 2006
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Можно много чего, но легче использовать какую-то хитрость в регулярном вывражении если она имеется, что я и пытаюсь выяснить... ;)

    Уже написал, сорри :rolleyes:
     
  8. vvy

    vvy New Member

    Joined:
    29 Mar 2009
    Messages:
    33
    Likes Received:
    3
    Reputations:
    4
    Регулярное выражение точно такое же как я тебе написал, но хитрость в его вызове, что б заменить текст по регулярному выражению в php есть функция preg_replace. А если регулярка вызывается функцией preg_match, к примеру, то она тебе не сможет заменить текст, она просто найдет тебе совпадения.
     
  9. kof

    kof New Member

    Joined:
    1 Jul 2006
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    vvy: В скрипте используется preg_replace, а изменить скрипт я не могу, могу лишь изменить само регулярное выражение :(
     
  10. vvy

    vvy New Member

    Joined:
    29 Mar 2009
    Messages:
    33
    Likes Received:
    3
    Reputations:
    4
    Code:
    ~(<img[^>]*>)~i
    эта регулярка найдет все изображения, что б она не смогла увидеть первое изображение нужно ее немного дописать, опираясь на html код этой картинки, поэтому давай код или несколько примеров, если он меняется (именно первое по счету изображение выделить из всех остальных, не дописывая кода, не получится)

    ЗЫ а ты можешь влиять на параметр "на что менять" в функции preg_replace?
     
    #10 vvy, 14 Feb 2010
    Last edited: 14 Feb 2010
  11. WNZRS

    WNZRS Member

    Joined:
    3 Sep 2009
    Messages:
    294
    Likes Received:
    52
    Reputations:
    1
    Если тебе надо не заменять какую-то определённую картинку, то добавь в регулярку то, почему она не подходит.
     
  12. kof

    kof New Member

    Joined:
    1 Jul 2006
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    дело в том что код картинки никак не отличается от других картинок на странице...

    да, смогу, есть идеи?
     
  13. vvy

    vvy New Member

    Joined:
    29 Mar 2009
    Messages:
    33
    Likes Received:
    3
    Reputations:
    4
    kof, я в php этим не разу не занимался, но думаю туда можно будет вставить функцию, всю целеком, вместе с телом (как безымянные функции в javascript), ток в начале попробовать нужно будет реализовать...
     
  14. kof

    kof New Member

    Joined:
    1 Jul 2006
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    vvy, понял идею, буду курить, спасибо!
     
  15. WNZRS

    WNZRS Member

    Joined:
    3 Sep 2009
    Messages:
    294
    Likes Received:
    52
    Reputations:
    1
    нельзя, для этого надо preg_replace_callback()

    Есть 2 варианта:
    Ничего не менять или менять всё на нужную картинку
     
  16. vvy

    vvy New Member

    Joined:
    29 Mar 2009
    Messages:
    33
    Likes Received:
    3
    Reputations:
    4
    ну не знаю, в моем интерпритаторе(стандартный от денвера) отлично работает вот такой код:
    PHP:
    function repl() {return '1111111';}
    $html=preg_replace('~(<img[^>]*>)~i',repl(),$html);
    но динамически создать функцию прямо в строке вызова preg_replace так и не получилось :(

    У меня созрел другой вариант: все лишние img-и можно просто "сломать"
    PHP:
    $html=preg_replace('~<img~i','<imggggggggg',$html);
    $html=preg_replace('~<imggggggggg~i','<img',$html,1);
    И получится, что неизвестный тег <imggggggggg> браузер не отобразит, а первую картинку мы вернем в прежнее состояние
     
  17. WNZRS

    WNZRS Member

    Joined:
    3 Sep 2009
    Messages:
    294
    Likes Received:
    52
    Reputations:
    1
    Ты вызываешь функцию и ставишь на замену её результат

    Не получиться, ты возвращаешь назад все каринки
     
    #17 WNZRS, 14 Feb 2010
    Last edited: 14 Feb 2010
  18. vvy

    vvy New Member

    Joined:
    29 Mar 2009
    Messages:
    33
    Likes Received:
    3
    Reputations:
    4
    Я возвращаю назад только первую найденную картинку (третий параметр в вызове функции)
    Спасибо, кеп. Но на самом деле это не важно, т.к. результат функции совершенно не зависит от найденного текста
    PHP:
    function repl() {
    static 
    $i;
    if (
    $i=='') {$i='1'; return '$1';}
        else return 
    '';
    }
    $html=preg_replace('~(<img[^>]*>)~i',repl(),$html);
    (Правдо, этот вариант не рабочий, но я не стал на нем заморациватся, т.к. все равно задать функцию не получилось)
     
  19. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    Привет.
    Code:
    echo preg_replace('/<img[^>]++>/se', '$Q++ ? "$0" : ""', $data);
    Будет notice.
     
    1 person likes this.