Tout d'abord, analyser le texte avec un analyseur HTML, avec quelque chose comme DOMDocument::loadHTML
. Notez que le code HTML peut être difficile à analyser et, selon l'analyseur, il se peut que vous obteniez des résultats légèrement différents dans le navigateur après l'exécution d'une telle fonction.
Le DOMDocument
de PHP n'est pas très flexible à cet égard. Vous pouvez avoir plus de chance en analysant d'autres outils. Mais si vous travaillez avec du HTML valide (et que vous devriez essayer de le faire, si c'est sous votre contrôle), rien de tout cela ne vous inquiète. Après l'analyse du texte, vous devez rechercher les liens dans les nœuds de texte et les remplacer. Utiliser une expression régulière est le moyen le plus simple.
Voici un exemple de script qui fait exactement cela:
<?php
function linkify($text)
{
$re = "@\b(https?://)?(([0-9a-zA-Z_!~*'().&=+$%-]+:)?[0-9a-zA-Z_!~*'().&=+$%-]+\@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+\.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z]\.[a-zA-Z]{2,6})(:[0-9]{1,4})?((/[0-9a-zA-Z_!~*'().;?:\@&=+$,%#-]+)*/?)@";
preg_match_all($re, $text, $matches, PREG_OFFSET_CAPTURE);
$matches = $matches[0];
$i = count($matches);
while ($i--)
{
$url = $matches[$i][0];
if (!preg_match('@^https?://@', $url))
$url = 'http://'.$url;
$text = substr_replace($text, '<a href="'.$url.'">'.$matches[$i][0].'</a>', $matches[$i][1], strlen($matches[$i][0]));
}
return $text;
}
$dom = new DOMDocument();
$dom->loadHTML('<b>stackoverflow.com</b> <a href="stackoverflow.com">test</a>');
$xpath = new DOMXpath($dom);
foreach ($xpath->query('//text()') as $text)
{
$frag = $dom->createDocumentFragment();
$frag->appendXML(linkify($text->nodeValue));
$text->parentNode->replaceChild($frag, $text);
}
echo $dom->saveHTML();
?>
Je ne suis pas venu avec cette expression régulière, et je ne peux pas se porter garant de son exactitude. Je n'ai pas non plus testé le script, sauf pour ce cas ci-dessus. Cependant, cela devrait être plus que suffisant pour vous lancer.
Sortie:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
<b><a href="http://stackoverflow.com">stackoverflow.com</a></b>
<a href="stackoverflow.com">test</a>
</body>
</html>
Notez que saveHTML()
ajoute les balises qui l'entourent. Si c'est un problème, vous pouvez les supprimer avec substr()
.
Y at-il une raison particulière pour laquelle vous n'aimez pas utiliser jQuery linkify? –
Je ne peux pas utiliser jQuery linkify sur mon site web car il y a d'autres scripts (mootools) qui sont en conflit avec jquery. – alhoseany