Как заменить <div> на другой тег и/или атрибут class из всех тегов <div> средствами PHP?

408
20 сентября 2017, 13:21

Спарсил информацию.

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

Как это можно сделать, чтобы не пострадал текст?

Первая строка:

<div class="cm-par-large">Это пример первого текста, где нужно заменить обрамляющий div с классом на обычный <p></div>

Должно получиться так:

<p>Это пример первого текста, где нужно заменить обрамляющий div с классом на обычный</p>

Следующая строка

<div class="cm-par-medium wysiwyg-component"> <p style="line-height: 19.2pt; margin: 0cm 0cm 15.0pt 0cm;"><span>Это пример второй строки из которой нужно удалить обрамляющие дивы но не трогать p span</span></p>
</div>

Она же на выходе:

<p style="line-height: 19.2pt; margin: 0cm 0cm 15.0pt 0cm;"><span>Это пример второй строки из которой нужно удалить обрамляющие дивы но не трогать p span</span></p>

В голове только идея перебрать все div, извлечь из них тексты и обернуть при необходимости в нужные теги, но как-то это сложновато, может быть, есть какая-то регулярка, которая позволяет удалять края, но не трогать содержимое?

Answer 1

Вот вам пример, изучайте:

<?php
$string = '<div class="cm-par-large">Это пример первого текста, где нужно заменить обрамляющий div с классом на обычный </div>
    Текст без тегов.
    <div class="cm-par-medium wysiwyg-component"> <p style="line-height: 19.2pt; margin: 0cm 0cm 15.0pt 0cm;"><span>Это пример второй строки из которой нужно удалить обрамляющие дивы но не трогать p span</span></p>
</div>
';
// Массив с regex шаблонами 
// (добавлен модификатор "x" для комментирования внутри шаблонов)
$pattern = [
    // 1-й шаблон для поиска и замены текста в контейнерах <div> :
    '~
        <(div)[^>]*> # Ищет <div(тут любой не обязательный текст)>
            (.+?)    # Ищет любой текст (вхождение символов тут обязательно)
        </\1>        # Ссылка на подмаску №1 (эквивалентно имени тега "div")
    ~x',
    // 2-й шаблон для поиска и замены тегов <div> :
    '~
        <(div)[^>]*> # Ищет <div(тут любой не обязательный текст)>
            |        # Оператор ветвления (ИЛИ)
        </(?1)>      # Рекурсивная ссылка на подмаску №1 (эквивалентно имени тега "div")
    ~x'
];
// Массив значений для подстановки 
$replace = ['<p>$2</p>', ''];
echo preg_replace($pattern, $replace, $string);
Answer 2

Если вам не нужно удалять атрибуты во всех возможных воображаемых случаях, то можно сделать совсем просто:

$result = preg_replace('#<div[^>]+>#i', '<div>', $string);

Помните, что парсить HTML регулярками - это дорога в ад.

READ ALSO
PHP - Бинарное изображение

PHP - Бинарное изображение

Нужно написать конвертор изображения в бинарный код и обратноВики

219
Бинарные данные php

Бинарные данные php

Есть картинка в виде бинарных данных взятых из базы (тип поля image), как из них получить картинку и вывести в верстку?

362
PHPunit тест для функции

PHPunit тест для функции

Есть функция f(), не принимающая параметров и содержащая другие функции f1, f2, f3, f4, expectДругие функции (f1, f2, f3, f4, expect) описаны в подключаемом файле

200