Удаление атрибутов во всех html тегах, кроме <img> (php)

455
16 февраля 2017, 01:15

Необходимо очистить html-код от стилей, которые в него написал визуальный редактор. Делаю так:

$handle = @fopen("new_item.htm", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer= fgetss($handle, 4096,'<img>,<title>,</title>,<table>,<tr>,</tr>,<td></td>,</table>'); 
        $html_clean= trim(preg_replace('/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i','<$1$2>',$buffer));
        echo($html_clean);      
    }
    fclose($handle);
}

В результате чего получаю требуемый вид кода, но с пустым содержимым тега <img>.

Как правильно дописать регулярку, чтобы она еще и игнорировала содержимое тега <img>?

Хочу получить что-то вроде:

<table>
<tr><td><img src="/path/img.jpg" width="100" height="400"></td></tr>
</table> 
Answer 1

Можно захватить целый тег <img> и восстановить с помощью обратной ссылки в шаблоне замены, но в PCRE есть и другой способ: использовать механизм пропуска совпадения.

preg_replace('/<img\b[^<]*>(*SKIP)(*F)|<([a-z][a-z0-9]*)[^>]*?(\/?)>/i','<$1$2>',$buffer)

<img\b[^<]*>(*SKIP)(*F)| означает: найди <img, после g должен быть символ, отличный от буквы/цифры или _, затем 0+ символов, отличных от <, а затем >, а когда шаблон найдёт совпадение, всё это надо отбросить и продолжить поиск совпадений с того места, где закочнилось предыдущее совпадение.

Исключений может быть и больше, просто добавьте альтернативную группу: /(?:ДРУГОЙ_ШАБЛОН_ИСКЛЮЧЕНИЯ|<img\b[^<]*>)(*SKIP)(*F)|ВАШ_ОСНОВНОЙ_ШАБЛОН/i.

READ ALSO
Идентификация посетителя сайта

Идентификация посетителя сайта

Всем приветнужно написать модуль "добавить товар в избранное"

331
Steam API Получить инвентарь человека

Steam API Получить инвентарь человека

Добрый день господа, столкнулся с такой проблемойРаньше делал парсер инвентаря пользователя, было все отлично

713
Не могу разобраться с ошибкой syntax error, unexpected $end in on line 48

Не могу разобраться с ошибкой syntax error, unexpected $end in on line 48

Ошибка Parse error: syntax error, unexpected $end in on line 48

349