Поиск текста по шаблону исключая <a и <img

Тема в разделе "Регулярные выражения", создана пользователем saab, 27 авг 2012.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. saab

    saab Постоялец

    Регистр.:
    22 янв 2010
    Сообщения:
    74
    Симпатии:
    39
    Здравствуйте, нет ли у кого регулярки на поиск определенного текста в html документе, при этом нужно исключить из результатов все совпадения, находящиеся внутри ссылок и изображений?
     
  2. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    С регулярными выражениями такой вариант не пройдет. Я в таком случае перед поиском с помощью регулярок удаляю весь лишний текст, а уже потом ищу.
     
  3. vhome

    vhome Создатель

    Регистр.:
    6 авг 2012
    Сообщения:
    37
    Симпатии:
    35
    Уберите все линки и картинки регуляркой <a\s+[^>]*>.*<\/a>|<img\s+[^>]*>
    А потом другой регуляркой ищите текст
     
  4. saab

    saab Постоялец

    Регистр.:
    22 янв 2010
    Сообщения:
    74
    Симпатии:
    39
    Спасибо за ответы, но не совсем понимаю как потом вернуть обратно линки и картинки в текст, измененный 2-й регуляркой? Я пытаюсь сделать автоматическую перелинковку страниц и на выходе надо получить html, в котором ключевые слова будут заменены линками из массива (ключевик-ссылка)
     
  5. vhome

    vhome Создатель

    Регистр.:
    6 авг 2012
    Сообщения:
    37
    Симпатии:
    35
    Вот наваял такой скриптик
    PHP:
    <?php
    $text 
    = <<<'EOT'
    key to hyt <a href="der/key"> key </a> frty <img src="path/key"/> <a href="der/key2"> other key </a>
    as fsdf sadf <img src="path/key"/> as gasdrg arg key <a href="der3/key"> key </a> fsefwesf
    EOT;
     
    // Запоминаем все линки
    $links_regexp '/(<a\s+[^>]*>[^<]*<\/a>)/im';
    preg_match_all($links_regexp$text$links);
     
    // Запоминаем все картинки
    $images_regexp '/(<img\s+[^>]*>)/im';
    preg_match_all($images_regexp$text$images);
     
    // Меняем линки на плейсхолдер
    $link_placeholder '{link_placeholder}';
    $no_links preg_replace($links_regexp$link_placeholder$text);
     
    // Меняем картинки на плейсхолдер
    $img_placeholder '{img_placeholder}';
    $no_links_and_images preg_replace($images_regexp$img_placeholder$no_links);
     
    // Меняем key - на линку
    $no_links_and_images preg_replace('/key/im''<a href="goto/hell">key</a>'$no_links_and_images);
     
    $count 1;
     
    // Возвращаем на место линки
    if (count($links[1]))
        foreach(
    $links[1] as $link)
            
    $no_links_and_images str_replace($link_placeholder$link$no_links_and_images$count);
     
    // Возвращаем на место картинки
    if (count($images[1]))
        foreach(
    $images[1] as $img)
            
    $no_links_and_images str_replace($img_placeholder$img$no_links_and_images$count);
     
    echo 
    $no_links_and_images;
    ?>
    заменит все кроме того что в картинках и ссылках
     
    saab нравится это.
  6. saab

    saab Постоялец

    Регистр.:
    22 янв 2010
    Сообщения:
    74
    Симпатии:
    39
    vhome, спасибо, принцип понял попробую применить.
    P.S. Что еще кроме ссылок и картинок стоит вырезать в данном случае, iframe и BBcode вроде все?
     
  7. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    Да вообще лучше любые теги убрать, так надежнее и практически ничего не стоит. Я бы модифицировал скрипт vhome следующим образом:

    PHP:
    <?php
    $text 
    = <<<'EOT'
    key to hyt <a href="der/key"> key </a> frty <img src="path/key"/> <a href="der/key2"> other key </a>
    as fsdf sadf <img src="path/key"/> as gasdrg arg key <a href="der3/key"> key </a> fsefwesf
    EOT;
     
    // Запоминаем всё лишнее
    $regexp '/(<a\s+[^>]*>[\W\w]*?<\/a>|<iframe[^>]*>[\W\w]*?<\/iframe>|<[^>]*>)/i';
    preg_match_all($regexp$text$remember);
     
     
    // Меняем линки на плейсхолдер
    $placeholder '{placeholder}';
    $clear_text preg_replace($regexp$placeholder$text);
     
    // Меняем key - на линку
    $clear_text preg_replace('/key/im''<a href="goto/hell">key</a>'$clear_text);
     
    $count 1;
     
    // Возвращаем на место
    if (count($remember[1]))
        foreach(
    $remember[1] as $r)
            
    $clear_text str_replace($placeholder$r$clear_text$count);
     
    echo 
    $clear_text;
    ?>
    Работоспособность не проверял, но смысл думаю понятен.
     
    saab нравится это.
Статус темы:
Закрыта.