Как с помощью регулярных выражение убрать фрагмент кода?

100
30 марта 2021, 02:30

Фрагмент кода:

...
<div>
    <div class="product-title">
        <a href="#">Title<span class="last-word">4.0</span></a>        
    </div>
</div>
...

Нужно убрать:

<div class="product-title">
       <a href="#">Title<span class="last-word">4.0</span></a>        
</div>

Моя проба:

 #<div class="product-title">\s*.+\s*<\/div>#ui

P.S. Моя проба рабочая, но я видел более универсальное решение, так как внутри могут быть и другие теги (кроме <div>)

Answer 1

Вариант, который вырезает элемент любого типа(тег должен быть сбалансированым), у которого определен класс product-title (классов у элемента может быть несколько) вместе со всеми дочерними элементами(если есть) любой вложенности. Теги дочерних элементов могут быть несбалансированными(например: <input ... />) или отсутствовать вовсе. Шаблон не чувствителен к форматированию текста.

Для извлечения тегов элементов, в шаблоне используются: backreferences; модификатор s - метасимвол . включает также и перевод строк.

<?php
$input = <<< EOT
<div>
    <div class="product-title">
        <a href="#">Title<span class="last-word">4.0</span></a>        
    </div>
</div>
EOT;
$output = preg_replace(
    "#<([A-Z][A-Z0-9]*)\b[^>]*?\bclass=\".*?\bproduct-title\b.*?\">[^<]*?(?:<([A-Z][A-Z0-9]*)\b[^>]*?>.*?(?:</\\2>)?)?[^<]*?</\\1>#sui",
    "",
    $input
);
echo $output;

Пример с более сложной иерархией дочерних элементов у вырезаемого элемента

READ ALSO
Сложить два массива php

Сложить два массива php

есть два массива:

129
Почему PHPDebug в VScode не видит локальный сайт на Docker

Почему PHPDebug в VScode не видит локальный сайт на Docker

Развернул сайт на Docker, но не могу сконнектить IDE VSCode c моим PHP серверомПосмотрел кучу мануалов, но даже не знаю где посмотреть ошибки от этого...

89
Авторизация на Laravel через сторонние API

Авторизация на Laravel через сторонние API

Есть сайт на Laravel, и есть API, которые расположены на другом сервере, они выполняют все функции ЛК от регистрации до пополнения баланса и прочими...

122
Ошибка при загрузке файлов Yii2:Call to undefined method UploadForm::formName()

Ошибка при загрузке файлов Yii2:Call to undefined method UploadForm::formName()

Я использую виджет kartik yii2-widget-fileinputВо вью вставил следующий код:

107