Замените тэг alt, если он не пустой - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть условие регулярного выражения, которое заменяет теги alt изображения, если они пусты.

// <img src="test1.jpg" alt="">

$replacement = '$1HELLO$2';
$pattern ='~(<img.*? alt=")("[^>]*>)~i';
$content = preg_replace($pattern, $replacement, $content);

// output <img src="test1.jpg" alt="HELLO">

Я пытаюсь найти способ, если тег alt не пуст, тогда он должен заменить всю строку. Я пробовал это, но он добавит слово в начале вместо замены.

// <img src="test2.jpg" alt="my alternative text">

$replacement = '$1HELLO$2';
$pattern ='~(<img.*? alt=")(.+/S.+>)~i';
$content = preg_replace($pattern, $replacement, $content);

// output <img src="test2.jpg" alt="HELLOmy alternative text">

Пока я хочу, чтобы вывод был <img src="test2.jpg" alt="HELLO">

Edit: я пытался с помощью метода DOM Parser ранее, но было несколько проблем. Это код.

function replaceALT($content) {
    global $post;
    $post = get_post($post->ID);
    $content = $post->post_content;
    $alt_keyword = "HELLO";
    $dom = new DOMDocument();
    $dom->loadHTML($content);

    $images = $dom->getElementsByTagName('img');

    foreach ( $images as $image) {
        if (empty($image->getAttribute("alt"))) {

            $image->setAttribute('alt', $alt_keyword);

        }
    }

    $content = $dom->saveHTML();

    return $content;
}
add_filter('the_content', 'replaceALT');

Было несколько вопросов. По какой-то причине он изменял содержание сообщений. Тег <p> был удален и заменен на <br>. Что я решил с помощью return wpautop( $content );. Другая проблема заключается в том, что img пользовательские данные были удалены. Например, тема WordPress TwentySeventeen возвращает изображение, подобное этому, в сообщении.

<img src="http://localhost/wp/wp-content/uploads/2018/08/image-1356510220.jpg" alt="" width="3264" height="2448" class="alignleft size-full wp-image-24" srcset="http://localhost/wp/wp-content/uploads/2018/08/image-1356510220.jpg 3264w, http://localhost/wp/wp-content/uploads/2018/08/image-1356510220-300x225.jpg 300w, http://localhost/wp/wp-content/uploads/2018/08/image-1356510220-768x576.jpg 768w, http://localhost/wp/wp-content/uploads/2018/08/image-1356510220-1024x768.jpg 1024w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" />

Но DOM-парсер возвращает изображение вот так.

<img src="http://localhost/wp/wp-content/uploads/2018/08/image-1356510220.jpg" alt="HELLO" width="3264" height="2448" class="alignleft size-full wp-image-24">

А так как мне нужно было заменить тэг alt внутри содержимого публикации div.

<!-- default output -->
<div class="entry-content">
    <p><img src="http://localhost/wp/wp-content/uploads/2018/08/image-1356510220.jpg" alt="" width="3264" height="2448" class="alignleft size-full wp-image-24" srcset="http://localhost/wp/wp-content/uploads/2018/08/image-1356510220.jpg 3264w, http://localhost/wp/wp-content/uploads/2018/08/image-1356510220-300x225.jpg 300w, http://localhost/wp/wp-content/uploads/2018/08/image-1356510220-768x576.jpg 768w, http://localhost/wp/wp-content/uploads/2018/08/image-1356510220-1024x768.jpg 1024w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" />Lorem ipsum dolor sit amet</p>
</div><!-- .entry-content -->

Это возвращало вывод как это.

<!-- DOM parser output -->
<div class="entry-content">
<p><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"><br />
<html><body><img src="http://localhost/wp/wp-content/uploads/2018/08/image-1356510220.jpg" alt="HELLO" width="3264" height="2448" class="alignleft size-full wp-image-24">Lorem ipsum dolor sit amet</body></html></p>
</div><!-- .entry-content -->

Может кто-нибудь помочь мне с этим. Спасибо

1 Ответ

0 голосов
/ 13 сентября 2018

Кажется, лучшее решение здесь -

'~(<img\s(?:[^<]*?\s)?alt=")[^"]+("[^<]*?>)~i'

Детали

  • (<img\s(?:[^<]*?\s)?alt=") - Группа 1:
    • <img - буквальная подстрока
    • \s - пробел
    • (?:[^<]*?\s)? - необязательная подстрока, состоящая из 0+ символов, отличных от <, с минимальным количеством возможных символов, с пробелом
    • alt=" - буквальная подстрока
  • [^"]+ - 1 или более символов, отличных от "
  • ("[^<]*?>) - Группа 2:
    • " - "
    • [^<]*? - любые 0+ символов кроме < как можно меньше
    • > - > char.
...