2010-01-13 6 views
0

Je cherche un moyen de remplacer les mots-clés dans une chaîne html avec une variable. En ce moment j'utilise l'exemple suivant.remplacer le mot-clé dans la chaîne html

returnString = Replace(message, "[CustomerName]", customerName, CompareMethod.Text) 

Ce qui précède fonctionnera correctement si le bloc html est réparti entièrement sur le mot-clé.

par ex. Toutefois, si la mise en forme du mot-clé est fractionnée dans le mot, la chaîne n'est pas trouvée et n'est donc pas remplacée.

par exemple.

<b>[Customer</b>Name] 

La mise en forme de la chaîne est hors de mon contrôle et n'est pas infaillible. Dans cet esprit, quelle est la meilleure approche pour trouver un mot-clé dans une chaîne html?

+1

Comment est-il possible d'avoir partiellement le formatage HTML dans le mot-clé? Lors du remplacement d'un tel mot-clé, il est impossible de deviner où le formatage HTML doit être placé dans le texte de remplacement. – Veger

+0

La fonction que j'essaie de créer reçoit une chaîne html.Il vient d'un éditeur html basique, qui a la possibilité de permettre à l'utilisateur d'appliquer un bloc de style à n'importe quel nombre de caractères. Cela permet à un segment du mot clé d'avoir un style. Il semble que le problème ne puisse pas être résolu à ce stade et que l'attention soit concentrée sur la façon dont la chaîne est créée à l'origine, pour éviter que cela se produise. – 53an

+0

Quelle langue utilisez-vous pour écrire la fonction? Il y a beaucoup de moteurs de templates HTML qui rendraient cela facile, bien que vous deviez utiliser leur syntaxe. –

Répondre

0

J'ai trouvé ce que je crois être une solution à ce problème. Dans mon scénario, ça marche.

L'entrée html a été modifiée pour placer chaque champ ou mot-clé personnalisé dans une div avec un ID d'ensemble. J'ai parcouru tous les éléments de la chaîne html en utilisant mshtml et ai mis le texte interne à la bonne valeur quand une correspondance est trouvée.

par exemple.

Function ReplaceDetails(ByVal message As String, ByVal customerName As String) As String 
    Dim returnString As String = String.Empty 
    Dim doc As IHTMLDocument2 = New HTMLDocument 
    doc.write(message) 
    doc.close() 
    For Each el As IHTMLElement In doc.body.all 
     If (el.id = "Date") Then 
      el.innerText = Now.ToShortDateString 
     End If 
     If (el.id = "CustomerName") Then 
      el.innerText = customerName 
     End If 
    Next 
    returnString = doc.body.innerHTML 
    return returnString 

Merci pour toute l'entrée. Je suis content d'avoir une solution au problème.

+0

c'est génial .. vous devriez marquer votre solution comme la réponse – Anurag

0

Utilisez la propriété de texte au lieu de innerHTML si vous utilisez javascript pour accéder au contenu. Cela devrait supprimer toutes les balises du contenu, vous redonnez une représentation textuelle propre du nom du client.

Par exemple, si le contenu ressemble à ceci:

<div id="name"> 
    <b>[Customer</b>Name] 
</div> 

Ensuite, l'accès à sa propriété de texte donne:

var name = document.getElementById("name").text; 
// sets name to "[CustomerName]" without the tags 

qui devrait être facile à traiter. Faites une recherche regex maintenant si vous avez besoin. Edit: Étant donné que vous effectuez ce traitement côté serveur, traitez le code XML de manière récursive et collectez les éléments de texte de chaque noeud. Depuis que je ne suis pas grand sur VB.Net, voici quelques pseudo-code:

getNodeText(node) { 
    text = "" 
    for each node.children as child { 
     if child.type == TextNode { 
      text += child.text 
     } 
     else { 
      text += getNodeText(child); 
     } 
    } 
    return text 
} 

myXml = xml.load(<html>); 
print getNodeText(myXml); 

Et puis remplacer ou tout ce qu'il ya à faire!

Questions connexes