Регулярным выражением удалить класс из <img>

235
09 февраля 2018, 19:28

Условие: имеются html-теги img с набором классов.

1. <img src="" alt="" width="" height="" class="alignleft size-medium wp-image">
2. <img src="" alt="" width="" height="" class="wp-image alignnone size-full">
3. <img src="" alt="" width="" height="" class="size-large wp-image alignright">

Задача: регулярным выражением в PHP удалить из тегов классы, содержащие "align".

Нашел такую основу:

<img.*?class="(.*?)"[^\>]+>

Как адаптировать?

Answer 1

Если проверяются исключительно теги img, то будет достаточно поиска по атрибуту class="...":

$str = '<img src="" alt="" width="" height="" class="alignleft size-medium wp-image">
<img src="" alt="" width="" height="" class="wp-image alignnone size-full">
<img src="" alt="" width="" height="" class="size-large wp-image alignright">';
echo preg_replace('~\s?class=".*align.*"~', '', $str);

Но если кроме img могут быть и другие теги, тогда можно сначала отфильтровать именно по тегу img, а потом - по атрибуту class="...":

$str = '<img src="" alt="" width="" height="" class="alignleft size-medium wp-image">
<img src="" alt="" width="" height="" class="wp-image alignnone size-full">
<img src="" alt="" width="" height="" class="size-large wp-image alignright">';
echo preg_replace_callback(
    '~<img[^>]*>~',
    function ($m) {
        return preg_replace('~\s?class=".*align.*"~', '', $m[0]);
    },
    $str
);

UPD: Ещё можно использовать подмаски, это наиболее краткий вариант:

$str = '<img src="" alt="" width="" height="" class="alignleft size-medium wp-image">
<img src="" alt="" width="" height="" class="wp-image alignnone size-full">
<img src="" alt="" width="" height="" class="size-large wp-image alignright">';
echo preg_replace('~(<img[^>]*)\sclass=".*align.*"([^>]*>)~', '$1$2', $str);

В всех случаях результат будет таким:

<img src="" alt="" width="" height="">
<img src="" alt="" width="" height="">
<img src="" alt="" width="" height="">

UPD-2: С учётом уточнений из комментариев автора топика, публикую ещё один вариант решения:

$str = '<img src="" alt="" width="" height="" class="alignleft size-medium wp-image">
<img src="" alt="" width="" height="" class="wp-image alignnone size-full">
<img src="" alt="" width="" height="" class="size-large wp-image alignright">';
echo preg_replace_callback(
    '~<img[^>]*>~',
    function ($m) {
        return preg_replace('~align\w+\s*|\s*align\w+~', '', $m[0]);
    },
    $str
);

Результат:

<img src="" alt="" width="" height="" class="size-medium wp-image">
<img src="" alt="" width="" height="" class="wp-image size-full">
<img src="" alt="" width="" height="" class="size-large wp-image">
READ ALSO
Перенос слов в тексте html, css

Перенос слов в тексте html, css

Есть текст в <pre> тегеСлова в тексте не переносятся, а режутся

257
Перемещение элемента вниз

Перемещение элемента вниз

Как перенести элемент вниз? Есть два слова "Смотреть работу" и они находятся не на одном уровне и я хочу переместить их на один уровеньКак...

219