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
| <?php
function ajouter_lien($html, $mot, $url, $limite=-1)
{
// extraction
$regex = sprintf('@<a\b[^>]+>.*?</a>|</?\w+[^>]+>|\b(%s)\b@si', $mot);
$options = PREG_SET_ORDER | PREG_OFFSET_CAPTURE;
preg_match_all($regex, $html, $captures, $options);
// enlever les non-remplacements qui étaient obligés pour émuler un "skip"
foreach ($captures as $index => $capture) {
// s'il n'y a pas de capture en $1, alors c'est un <a>...</a> ou attibuts
// ref.: <a\b[^>]+>.*?</a>|</?\w+[^>]+>
if (empty($capture[1])) unset($captures[$index]); // non-remplacement
// sinon, c'est un mot du contenu: ref.: |\b(%s)\b
else $captures[$index] = $capture[0]; // conserver seulement la capture 0
}
// considérer la limite maximale de remplacements, -1 pour tous
if ($limite > -1) $captures = array_slice($captures, 0, $limite);
// faire les remplacements selon le contenu restant de $captures
// array_reverse permet de conserver les offsets valides pour substr_replace
foreach (array_reverse($captures) as $capture) {
$remplacer = sprintf('<a href="%s">%s</a>',
$url,
$capture[0]); // le mot capturé en 0
$html = substr_replace($html,
$remplacer,
$capture[1], // offset de remplacement en 1
strlen($capture[0]));
}
// retourer le HTML altéré
return $html;
}
$html = '<img title="voiture"/> <b>voiture</b>, 1ere Voiture, <strong>2e voiture</strong>, 3e <strong><em>voiture</em></strong>, 4e voiturE et une dernière <a href="#">voiture</a>.';
echo ajouter_lien($html, 'voiture', 'http://exemple.com');
echo PHP_EOL, '<hr/>', PHP_EOL;
echo ajouter_lien($html, 'voiture', 'http://exemple.com', 2);
?> |
Partager