За последние 24 часа нас посетил 22721 программист и 1273 робота. Сейчас ищут 683 программиста ...

Удалить неиндексируемую ссылку

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

  1. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Выручайте! Мозг под вечер уже не работает.
    В коде:
    HTML:
    1. <a href="/page1.html">
    2.     Текст1
    3. </a>
    4. <a href="/page2.html" rel="nofollow">
    5.     Текст2
    6. </a>
    7. <a href="/page3.html">
    8.     Текст3
    9. </a>
    Необходимо удалить вторую ссылку, оставив первую и третью.
    Пытаюсь сделать это кодом:
    PHP:
    1. $file=preg_replace("/<a.*?[^>].*?rel=[\"|\']nofollow[\"|\'].*?>.*?<\/a>/is", "", $file);
    Но регулярка "ловит" выражение начиная с <a первой ссылки и заканчивая </a> второй ссылки.
    Проверяю в этой песочнице.
    Подскажите как удалить только вторую ссылку, содержащую rel="nofollow".
    Заранее благодарю!
    ПС: Ссылки могут быть разные, содержать стили, другие данные. Цель удалить любую ссылку с rel="nofollow".
     
  2. kazadai90

    kazadai90 Активный пользователь

    С нами с:
    6 фев 2013
    Сообщения:
    103
    Симпатии:
    19
    Код (Text):
    1. $file = '<a href="/page1.html">
    2.     Текст1
    3. </a>
    4. <a href="/page2.html" rel="nofollow">
    5.     Текст2
    6. </a>
    7. <a href="/page3.html">
    8.     Текст3
    9. </a>';
    10.  
    11. preg_match_all("/<[Aa][\s]{1}[^>]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\s]*([^ \"'>\s#]+)[^>]*[Rr][Ee][Ll][^=]*=[\"\']nofollow[\"\']>/", $file, $matches);
    12. var_dump($matches);
     
  3. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    @kazadai90, ого!!!)))
    Не совсем то, что мне надо. Дело в том, что в тэге <a> могут быть еще разные штуки: id, class, style, пробелы и т.д. Куда их воткнет программист не известно. Но это наверное моя ошибка, надо было это сразу указать.
    Но спасибо, что помогли найти мой косяк. Регулярка
    Код (Text):
    1. /<a[^>]*rel=[\"|\']nofollow[\"|\'].*?>.*?<|\/a>/is
    вполне подходит.
    Да, и модификатор i прикольная штука. Рекомендую)
     
  4. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Код (Text):
    1. $file = preg_replace('#<a\s[^>]*rel\s*=\s*["\']?nofollow.+?</a>#is', '', $file);
    Или
    Код (Text):
    1. $doc = new DOMDocument;
    2. $doc->loadHTML($file);
    3.  
    4. $xpath = new DOMXpath($doc);
    5.  
    6. foreach ($xpath->query('//a[@rel="nofollow"]') as $a) {
    7.     $a->parentNode->removeChild($a);
    8. }
    9.  
    10. $file = $doc->saveHTML();
     
  5. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    @Emilien
    Такую ссылку ваша регулярка не возьмет:
    HTML:
    1. <a    class="sdf"   rel="nofollow"  href="/page2.html" >
    2.     Текст2
    3. </a>
    Но вы правы, до и после равно действительно могут быть пробелы.
    Это работает:
    Код (Text):
    1. #<a[^>]*rel\s*=\s*[\"|\']nofollow[\"|\'].*?>.*?</a>#is
     
    #5 kit, 23 авг 2019
    Последнее редактирование: 23 авг 2019
  6. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    С чего вдруг? Там всё нормально с такой ссылкой https://rextester.com/WUH25198

    Ну и в [\"|\'] нет смысла ставить |
     
  7. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Код (Text):
    1. /<a(.*)rel=["|\']nofollow["|\']>[\s\w]+<\/a>/mu
     
  8. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Всем спасибо!