1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| function add_lazy_loading_to_img($content) {
$trans = ['src' => 'data-src', 'srcset' => 'data-srcset'];
return preg_replace_callback('~<img((?:\s+[^\s<>]*)*+)>~i', function ($m) use ($trans) {
// parse attributes
if ( preg_match_all('~(?<attr> \S [^\s=]* )
(?: =
(?| (?<q> " ) (?<val> [^"]* ) " # double quotes
| ( \' ) ( [^\']* )\' # single quotes
| ( ) ( \S* ) # no quotes
)
)?
~x', rtrim($m[1], '/'), $matches, PREG_SET_ORDER) === false )
return $m[0];
$img = '<img ';
$attributes = array_column($matches, 'attr');
// add the class attribute if missing
if ( !in_array('class', $attributes) )
$img .= 'class="lazy-load" ';
foreach ($matches as $match) {
// translate src and srcset to data-src and data-srcset
$attrlc = strtolower($match['attr']);
$match['attr'] = isset($trans[$attrlc]) ? $trans[$attrlc] : $match['attr'];
// add missing quotes
if ( empty($match['q']) )
$match['q'] = '"';
if ( $attrlc === 'class' ) {
$classes = isset($match['val']) ? preg_split('~\s+~', trim($match['val'])) : [];
$classes[] = 'lazy-load'; // add lazy-load class
$match['val'] = implode(' ', array_unique($classes)); // remove duplicate classes
$match['q'] = '"'; // force double quotes
}
$img .= isset($match['val']) ? "{$match['attr']}={$match['q']}{$match['val']}{$match['q']} "
: "${match[0]} ";
}
return $img . '/>';
}, $content);
} |
Partager