2010-06-21 9 views
1

Je souhaite remplacer les noms dans un texte par un lien vers leur profil.Remplacer les noms dans le texte par des liens

$text = "text with names in it (John) and Jacob."; 
$namesArray("John", "John Plummer", "Jacob", etc...); 
$LinksArray("<a href='/john_plom'>%s</a>", "<a href='/john_plom'>%s</a>", "<a href='/jacob_d'>%s</a>", etc..); 
//%s shout stay the the same as the input of the $text. 

Mais si nécessaire, un peut changer de tableau.

J'utilise maintenant 2 tableaux utilisés str_replace. comme ceci $text = str_replace($namesArray, $linksArray, $text); mais le cri de remplacement fonctionne pour le nom avec un «point» ou «)» ou quelque chose comme ça à la fin ou au début. Comment puis-je obtenir le remplacer pour travailler sur un texte comme celui-ci.

Le cri de sortie soit "text with names in it (<a.....>John</a>) and <a ....>Jacob</a>."

+0

Alors voulez-vous qu'un point soit supprimé dans 'Jacob.'? – serg

+0

à quoi ressemble votre '$ namesArray'? – jigfox

+0

Pas le message de sortie être "texte avec des noms dedans ( John) et Jacob." Le tableau ressemble à $ namesArray ("John", "John Plummer", "Jacob", etc ...); Le tableau de liens est $ LinksArray ("%s", etc ..); % s shout reste le même que l'entrée du $ text. Mais si nécessaire un peut changer de tableau. – Remi

Répondre

1

Voici un exemple pour un seul nom, vous devez répéter cette opération pour chaque élément de votre tableau:

$name = "Jacob"; 
$url = "<a href='/jacob/'>$1</a>"; 
$text = preg_replace("/\b(".preg_quote($name, "/").")\b/", $url, $text); 
+0

thx, j'ai toujours un problème si je mets ceci dans la boucle la recherche de fonction de remplacement est le texte déjà remplacé, qui pourrait masser les choses. – Remi

+0

Pouvez-vous donner un exemple? – serg

+0

Essayez de trier un tableau par longueur de nom et commencez par le plus court. – serg

1

Essayez quelque chose comme

$name = 'John'; 
$new_string = preg_replace('/[^ \t]?'.$name.'[^ \t]/', $link, $old_string); 

de preg_replace PHP accepte de type mixte et sujet, autrement dit, vous pouvez fournir un éventail de modèles comme celui-ci et un tableau de remplacement.

0

Rechercher les expressions régulières. Quelque chose comme preg_replace().

preg_replace('/\((' . implode('|', $names) . ')\)/', 'link_to_$1', $text); 

Notez que cette solution prend le tableau de noms, pas seulement un nom.

+1

je suce avec regex – Remi

1

DONE, et pas regex:

$text = "text with names in it (John) and Jacob."; 
$name_link = array("John" => "<a href='/john_plom'>", 
    "Jacob" => "<a href='/jacob'>"); 
foreach ($name_link as $name => $link) { 
    $tmp = explode($name, $text); 
    if (count($tmp) > 1) { 
    $newtext = array($tmp[0], $link, $name, "</a>",$tmp[1]); 
    $text = implode($newtext); 
    } 
} 
echo $text; 

Les liens ne seront jamais changer pour chaque entrée donnée, donc je ne suis pas sûr si j'ai compris votre question. Mais j'ai testé cela et cela fonctionne pour la chaîne donnée. Pour l'étendre, ajoutez simplement plus d'entrées au tableau $name_link.

Questions connexes