PHP str_replace () и preg_replace () не работают с HTML - PullRequest
0 голосов
/ 27 ноября 2018

Когда я пытаюсь выполнить str_replace() или preg_replace() внутри функции, содержимое не изменяется.

Содержимое в переменной $sadrzaj:

$sadrzaj = '<p>asdasdasds</p><p><a href="http://www.example.com/wp-content/uploads/2018/11/image.jpg" itemprop="url" title="some title"><img alt="some alt title" class="alignnone size-full wp-image-243618" src="http://www.example.com/wp-content/uploads/2018/11/image.jpg" width="940" height="529"></a></p>asdasdasd<p>asdasd</p><h3>asdada</h3><p><a href="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" itemprop="url" title="some title 02"><img alt="some alt title 02" class="alignnone size-full wp-image-243653" src="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" width="940" height="529"></a></p><h3>asdasd</h3>';

Моя функция to_je_to():

function to_je_to($content){
    preg_match_all('/<img (.*?)\/>/', $content, $images);
    //print_r($images);

    if(!is_null($images)){
        foreach($images[1] as $index => $value){
            if(strpos($images[1], 'size-full') !== false){
            //if(preg_match('/alt=""/', $value)){
                $new_img = preg_replace('<img', "<img data-example", $images[0][$index]);
                $content = preg_replace($images[0][$index], $new_img, $content);
            }
        }
    }
    echo $content; // return no difference
}

Вызов функции to_je_to($sadrzaj); - ничего не меняется.

Если есть класс с "size-full", найдите эти изображения и замените их тег на <img data-example ...>.

Даже str_replace() или preg_replace() не работает.

Что я делаю не так?

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

То, что вы делаете неправильно, - это анализ HTML с помощью регулярного выражения.Вы должны использовать правильный DOM-парсер, а затем вы можете использовать XPath-запросы для изоляции ваших желаемых элементов.

<?php
$sadrzaj = '<p>asdasdasds</p><p><a href="http://www.example.com/wp-content/uploads/2018/11/image.jpg" itemprop="url" title="some title"><img alt="some alt title" class="alignnone size-full wp-image-243618" src="http://www.example.com/wp-content/uploads/2018/11/image.jpg" width="940" height="529"></a></p>asdasdasd<p>asdasd</p><h3>asdada</h3><p><a href="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" itemprop="url" title="some title 02"><img alt="some alt title 02" class="alignnone size-full wp-image-243653" src="http://www.example.com/wp-content/uploads/2018/11/image_02.jpg" width="940" height="529"></a></p><h3>asdasd</h3>';

function to_je_to($content) {
    $dom = new DomDocument;
    $dom->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    $xp = new DomXpath($dom);
    $nodes = $xp->query("//img[contains(concat(' ', normalize-space(@class), ' '), ' size-full ')]");
    foreach ($nodes as $img) {
        $img->setAttribute("data-example", "");
    }
    return $dom->saveHTML();
}
echo to_je_to($sadrzaj);

И, комментируя ваш оригинальный код: $images никогда не будет null,это всегда будет массив.Зачем перебирать $images[1], а затем заменять значения на $images[0]?Групповой матч (.*?) вообще не нужен, поэтому его там не нужно.Ни один из вызовов preg_replace() в цикле не использует разделители вокруг выражения для поиска, поэтому оба они потерпели бы ошибку.И есть очень большая разница между echo и return.

0 голосов
/ 27 ноября 2018

Есть несколько проблем с вашей функцией (в ваших preg_match_all и preg_replace).Кроме того, вам нужно быть более изощренным с точки зрения соответствия class на теге <img>.В целом, было бы лучше использовать встроенный класс DOMDocument, как предлагает другой ответ.Если вы хотите продолжать использовать регулярные выражения, эта функция должна исправить возникшие проблемы.

function to_je_to($content){
    preg_match_all('/<img[^>]+>/', $content, $images);

    if(!is_null($images)){
        foreach($images[0] as $index => $value){
            if(preg_match('/class="[^"]*(?<=["\s])size-full[\s"]/', $value)){
                $new_img = str_replace('<img', '<img data-example', $value);
                $content = preg_replace('/' . preg_quote($value, '/') . '/', $new_img, $content);
            }
        }
    }
    return $content; // return no difference
}
echo to_je_to($sadrzaj);

Демонстрация на 3v4l.org

...