2010-09-21 6 views
1

J'ai une fonction qui convertit les chaînes comme 'www.example.com' et 'http://example.com' en hyperliens. Il traite également des sous-domaines, par ex. 'http://sub.example.com'.PHP - Fonction de trouver des liens dans le texte

Mais il échoue avec celui-ci - http://www .example.com » et produit les éléments suivants

<a href="http://<a href="http://www.chemica.ru">www.chemica.ru</a>">http://<a href="http://www.chemica.ru">www.chemica.ru</a></a> 

S'il vous plaît, quelqu'un peut-il aider? Le problème est que "http: //" et "www." sont ensemble et les deux ont des façons différentes de convertir.

function makeLinks($text){ 
$text = eregi_replace('(((f|ht){1}tp://)[[email protected]:%_\+.~#?&//=]+)', '<a href="\\1">\\1</a>', $text); 
$text = eregi_replace('(www.[[email protected]:%_\+.~#?&//=]+)', '<a href="http://\\1">\\1</a>', $text); 
$text = eregi_replace('([_\.0-9a-z-][email protected]([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})', '<a href="mailto:\\1">\\1</a>', $text); 
return $text; 
} 
+3

Les fonctions FYI, eregi_ * sont obsolètes. Vous devriez passer à preg_replace à un moment donné dans un proche avenir. – webbiedave

+0

PCRE permet également des fonctionnalités regex plus avancées que POSIX. –

+0

duplication possible de [Comment extraire les liens http d'un paragraphe et les stocker dans un tableau sur php] (http://stackoverflow.com/questions/6861324/how-to-extract-http-links-from-a-paragraph -et-stocker-les-dans-un-tableau-sur-php) – hakre

Répondre

2

Vous pouvez lire this blog post by Jan Goyvaerts quelques idées sur la façon de trouver les URL dans le texte.

Pour résoudre votre problème immédiat, vous pouvez ajouter un négatif à votre lookbehind seconde regex: (?<!http://)(www.[[email protected]:%_\+.~#?&/=]+) assure que www... ne sera trouvée si elle n'est précédée par http://.

Cependant, les fonctions ereg sont obsolètes et ne prennent pas en charge la recherche d'apparence. Vous devez donc utiliser preg_replace().

$text = preg_replace('/(?<!http:\/\/)(www.[[email protected]:%_\+.~#?&\/=]+)/i', '<a href="http://\1">\1</a>', $text); 

devrait fonctionner.

0

Pour les deux 'http://' et 'www.'ensemble, vous pouvez faire quelque chose comme this:

$text = "http://www.example.com is a nice site"; 
$link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>", $text); 
echo $link; 

Works pour les URL commence par http: //

4

il suffit d'écrire à la page de votre point de vue (vous ne nécessite pas de bibliothèque ou de fonction d'assistance):

$text = "Good Site is http://masalahkita.com"; 
$link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>", $text); 

echo $link; 
Questions connexes