За последние 24 часа нас посетили 22384 программиста и 1056 роботов. Сейчас ищет 621 программист ...

Заменить, если в блоке есть блок...

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

  1. Sevbanchik

    Sevbanchik Новичок

    С нами с:
    9 ноя 2020
    Сообщения:
    1
    Симпатии:
    0
    Никак не удаётся добиться получить регулярку. На regex101.com она работает, а на сайте - нет...

    В блоке типа
    HTML:
    1. <div>
    2. text text text <tag>text</tag>
    3. <ul class="fff">
    4.    <li>text</li>
    5. </ul>
    6. text text text
    7. </div>
    Нужно заменить <div> на <div class="class">, но только если между этими <div> и </div> где-то есть какой-то блок с class="fff"
    Если тега с таким классом нет, то ничего не делать.
    Заранее благодарю за помощь.
     
  2. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    PHP:
    1. $html = '
    2. <div>
    3. <ul class="xxx">
    4.  <li>text</li>
    5. </ul>
    6. </div>
    7.  
    8. <div>
    9. <ul class="fff">
    10.  <li>text</li>
    11. </ul>
    12. </div>
    13. ';
    14.  
    15. $doc = new DOMDocument;
    16. $doc->loadHTML($html);
    17.  
    18. $xpath = new DOMXpath($doc);
    19.  
    20. foreach ($xpath->query('//div[not(@class) and .//*[@class="fff"]]') as $node) {
    21.   $node->setAttribute('class', 'class');
    22. }
    23.  
    24. echo $doc->saveHTML();