Замените встречающиеся теги / теги img на себя, но добавьте некоторую строку в данную строку

0

Я хочу заменить теги img в строке. Замена тега img и добавление, например, тега [href] отлично работает с парсером dom, но это не поможет мне, поскольку мне нужно изменить теги в существующей строке html. Я знаю, что изменение html с регулярным выражением - не очень хорошая идея, но я не могу понять, как изменить теги img как целые строки в html. Кроме того, мне нужно обернуть тег в [href], где [href] предоставляется через свойство тега img.

<img class="myclasses" width="100" src="mysource" data-image-src="another_src">

После "преобразования" любой найденный тег img должен выглядеть так:

<a href="another_src"><img [...] src="http://myexample.me[mysource]"></a>

Я получил его для работы, если одно изображение находится в строке, но не удалось обработать два изображения.

Надеюсь, кто-то может мне помочь :)

Теги:
dom

1 ответ

2
Лучший ответ

Возможно, вы, возможно, достигнете того, что вам нужно, используя preg_replace_callback а затем preg_replace_callback через атрибуты изображения в функцию обратного вызова.

Так, например, учитывая эту тестовую строку:

$content= <<<HTML
<img alt="image-alt-2" src="image-path" style="width: 20px; height: 15px; border: 1px solid red;" title="image-title" data-image-src="another_src" />
    <p>Some other tags. These shouldn\'t be changed<br />Etc.</p>
<img alt="image-alt-2" src="image-path-2" style="width: 35px; height: 30px;" title="another-image-title" data-image-src="somewhere_else" />
HTML;

Затем мы можем сопоставить изображения и вызвать нашу функцию замены:

$content= preg_replace_callback('/<img ((?:[-a-z]+="[^"]*"\s*)+)\/>/i', 'replaceImage', $content);

Для моего примера я просто data-image-src атрибут data-image-src и использую его для создания ссылки, все остальное остается как есть:

function replaceImage($matches) {
    // matches[0] will contain all the image attributes, need to split
    // those out so we can loop through them
    $submatches= array();
    $donelink= false;
    $count= preg_match_all('/\s*([-a-z]+)="([^"]*)"/i', $matches[1], $submatches, PREG_SET_ORDER);

    $result= '<img ';

    for($ndx=0;$ndx<sizeof($submatches);$ndx++) {
        if ($submatches[$ndx][1]=='data-image-src') {
            // Found the link attribute, prepend the link to the result
            $result= "<a href=\"{$submatches[$ndx][2]}\">$result";
            $donelink= true; // We've added a link, remember to add the closing </a>
        }
        // You can handle anything else you want to change on an attribute-by-attribute basis here
        else {
            // Something else, just pass it through
            $result.= $submatches[$ndx][0];
        }
    }

    return "$result/>".($donelink?'</a>':'');
}

Выполнение этого содержимого образца дает:

<a href="another_src"><img alt="image-alt-2" src="image-path" style="width: 20px; height: 15px; border: 1px solid red;" title="image-title"/></a>
    <p>Some other tags. These shouldn\'t be changed<br />Etc.</p>
<a href="somewhere_else"><img alt="image-alt-2" src="image-path-2" style="width: 35px; height: 30px;" title="another-image-title"/></a>

Надеюсь, это поможет!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню