2010-12-07 21 views
1

je veux convertir les liens de texte dans ma page de contenu en liens actifs en utilisant php. J'ai essayé tous les scripts possibles, ils sont tous très bien, mais le problème est qu'ils convertissent les liens dans img src tag. ils convertissent les liens partout et cassent le code html.création de lien automatique en utilisant php sans casser les balises html

Je trouve un bon script qui fait ce que je veux exactement mais il est en javascript. on l'appelle jquery-linkify. vous pouvez trouver le script ici http://github.com/maranomynet/linkify/

l'astuce dans le script qu'il convertit les liens de texte sans casser le code html. J'ai essayé de convertir le script en PHP, mais a échoué.

Je ne peux pas utiliser le script sur mon site web car il y a d'autres scripts qui ont un conflit avec jquery.

quelqu'un pourrait réécrire ce script pour PHP? ou au moins me guider comment?

merci.

+0

Y at-il une raison particulière pour laquelle vous n'aimez pas utiliser jQuery linkify? –

+0

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

Répondre

1

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().

+0

Je pensais à ce sujet mais d'une manière différente. Dans jquery.linkify, il convertit ">" et "<" en entités html. puis utilise l'expression régulière pour rechercher des liens sans qoutes, ">" et "<". Je pense que c'est l'astuce comment ne pas toucher les balises html. – alhoseany

+1

J'ai essayé votre code. c'est très bon et ça marche mais il y a 2 problèmes. 1- l'encodage de charachter du contenu est en arabe après avoir exécuté ceci à travers le script il donne des caractères inconnus comme ceci: "بÙ" ÙŠÙ "يسÙ" ÙŠ ". est-il de toute façon nous pouvons ajuster l'encodage? 2- le script convertit les liens comme ceci (http: // www et www.) Mais ne convertit pas les liens comme celui-ci (http://yahoo.com). – alhoseany

+0

ne convertit pas les liens commençant par "http: //" mais sans "www". – alhoseany

0

Utilisez un HTML parser et recherchez uniquement les URL dans les nœuds de texte.

+0

merci je vais essayer cela aujourd'hui j'espère que cela fonctionne. – alhoseany

0

Je pense que l'astuce consiste à suivre les simples 'et guillemets' dans votre code PHP et de les fusionner de manière correcte afin de mettre '' à l'intérieur '' 'ou vice versa.

Par exemple,

<?PHP 

    //old html tags 
    echo "<h1>Header1</h1>"; 
    echo "<div>some text</div>"; 

    //your added links 
    echo "<p><a href='link1.php'>Link1</a><br>"; 
    echo "<a href='link1.php'>Link1</a></p>"; 

    //old html tags 
    echo "<h1>Another Header</h1>"; 
    echo "<div>some text</div>"; 

    ?> 

J'espère que cela vous aide ..

+0

Je pense que vous avez raison sur les citations. dans jquery.linkify, il utilise cette expression régulière. '/ (?:^| ["' (\ s] | <) (www \ .. +? \ .. +?) (?: (?: [:?] | \. +)? (?: \ s | $) | > | [) "',])/g,' – alhoseany

+0

et dans cette regex il y a des qoutes doubles et simples. Je ne sais pas comment les échapper à l'intérieur de la regex sans le casser. – alhoseany

0
$text = 'Any text ... link http://example123.com and image <img src="http://exaple.com/image.jpg" />'; 
$text = preg_replace('!([^\"])(http:\/\/(?:[\w\.]+))([^\"])!', '\\1<a href="\\2">\\2</a>\\3', $text); 
+0

merci, je vais essayer ce code. J'espère que ca fonctionne. – alhoseany

+0

votre code est très bon. simple et ne pas casser les balises html mais il ne convertit pas les liens comme ceci: -www.yahoo.com -http: //example.com/data – alhoseany

Questions connexes