2010-07-02 3 views
1

j'ai le code suivant:Javascript remplacer des problèmes (avec atribbutes alt et title)

function getArticleContent() { 

    var toPromote = 'example'; 

    var toReplace = '<a href="/tags/'+toPromote+'">'+toPromote+'</a>'; 

    var content = $(".a-entry").text(); 

    if (content.search(toPromote) > -1) 
    {   
     $('.a-entry').html($('.a-entry').html().replace(new RegExp(toPromote, "g"), toReplace)); 
    } 
    else 
    { 
     // 
    } 
} 
$(document).ready(function() { 
    getArticleContent(); 
}); 

Le code fonctionne très bien, mais si une image ou un lien a un titre ou attribut alt égal avec le texte que je vouloir remplacer le code HTML, il est cassé, parce que le script met le lien dans l'alt, ou la balise de titre.

Meilleures salutations


Je suis en train de faire quelque chose comme ceci:

<div id="article"> 
<p>Some text here, bla bla.</p> 
</div> 

Une fois la fonction JS je veux être:

<div> 
    <p>Some text <a href="/tags/here">here</a>, bla bla.</p> 
</div> 
+1

Il y a une raison pour laquelle ils disent [vous ne devriez pas mélanger regex avec html] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 # 1732454). ** Ils ne se mélangent pas bien. ** Utilisez le dom parser. – Amarghosh

Répondre

0

Essayez d'utiliser le jQuery. La balise attr() pour faire le remplacement sur la balise de l'attribut href ou sur le .text() de c'est ce que vous voulez changer. Sinon, il peut être utile d'afficher un balisage pour voir exactement ce que vous voulez (exemples avant/après).

.attr('href',yournewstuff); 

OU

.text(yournewstuff); 
2

Vous pouvez faire quelque chose comme ça, mais il peut y avoir un moyen plus court (nœuds de texte sont un très événement rare pour moi):

function getArticleContent() { 
    var toPromote = 'example'; 
    $(".a-entry").contents().filter(function() { return this.nodeType == 3; }) 
    .each(function() { 
     if(this.nodeValue.indexOf(toPromote) > -1) 
     $(this).replaceWith(this.nodeValue.replace(new RegExp(toPromote, "g"), 
      function(m) { return '<a href="/tags/'+m+'">'+m+'</a>'; }) 
     ); 
    }); 
} 
$(getArticleContent);​ 

You can try a demo here. Ceci filtre spécifiquement les nœuds de texte nodeType == 3, pour .each() de ceux-ci, il boucle, et si le texte est là, remplace chaque correspondance par le lien correspondant.

+0

+1 - J'aime l'utilisation du contenu, du filtre et du nodeType. Très bonne réponse – Krunal

+0

Le script fonctionne, mais il faut obtenir à partir du BD les détails de l'article avec des balises whit, par exemple:

My text here...

iulian

+0

@iulian - Voici un exemple mis à jour, essayez-le: http://jsfiddle.net/7C9DC/2/ –

Questions connexes