2013-06-08 3 views
-3

J'ai une exigence. J'ai une chaîne qui a une valeur pour par exemple:Manipulation de chaînes - éditeur de texte enrichi

<p>We are pleased <a href="http://www.anc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html">to present the new product type</a>. This new product type is the best thing since sliced bread. We are pleased to present the new product type. This new product <a href="mailto:[email protected]">type is the best</a> thing since sliced bread.</p> 

Le texte ci-dessus sera stocké sous forme d'une seule valeur de chaîne. J'ai besoin d'ajouter certains paramètres aux hrefs après avoir vérifié les critères. Faites-moi savoir comment extraire uniquement le href et ajouter le paramètre et afficher la chaîne sans dommage (FYI: la chaîne est la valeur entrée via RTE - éditeur de texte riche)

Essayé cette approche mais sans succès.

String tmpStr = "href=\"http://www.abc.com\">design"; 

StringBuffer tmpStrBuff = new StringBuffer(); 
String[] tmpStrSpt = tmpStr.split(">"); 
if (tmpStrSpt[0].contains("abc.com")) { 
    String[] tmpStrSpt1 = tmpStrSpt[0].split("\""); 
    tmpStrBuff.append(tmpStrSpt1[0]); 
    if (tmpStrSpt1[1].contains("?")) { 
     tmpStrBuff.append("\"" + tmpStrSpt1[1] + "&s_cid=abcd_xyz\">"); 
    } else { 
     tmpStrBuff.append("\"" + tmpStrSpt1[1] + "?s_cid=abcd_xyz\">"); 
    } 
    tmpStrBuff.append(tmpStrSpt[1]); 
    tmpStrBuff.append("</a>"); 
    System.out.println(" <p>tmpStr1:::: " + tmpStrBuff.toString() + "</p>"); 
} 

l'autre approche utilisée est:

String[] tmpTxtArr = text.split("\\s+"); 
StringBuffer tmpStrBuff = new StringBuffer(); 
for (String tmpTxt : tmpTxtArr) { 
    descTxt += (tmpTxt.contains("abc.com") && !tmpTxt.contains("?")) ? tmpTxt 
      .replace("\">", "?s_cid=" + trackingCode + "\">" + " ") 
      : tmpTxt + " "; 
} 
+0

Comment est-ce lié à Java? – Lion

+0

J'ai besoin du code en Java. – user1661908

+2

Eh bien au moins, vous devriez rejeter regex. L'analyse du langage de balisage avec regex n'est pas une très bonne idée. Aussi pourquoi Javascript? – Mena

Répondre

2

Description de

Cette expression rationnelle:

  1. trouver l'attribut href dans les balises d'ancrage
  2. exigent href avoir http://abc.com. Il permettra également https et www.abc.com dans leurs positions respectives.
  3. si la chaîne contient un ? alors qui sera capturé trop et placé dans le groupe capture 3

<a\b[^<]*\bhref=(['"])(https?:\/\/(?:www[.])?abc[.]com[^"'?]*?([?]?)[^"'?]*?)\1[^<]*<\/a>

enter image description here

Groupes

groupe 0 aura l'ancre toute de l'ouverture <a à la clôture </a>. Si vous trouvez que cela est excessif ou qu'il entre en collision avec des balises d'ancrage imbriquées, supprimez simplement le [^<]*<\/a> à la fin de cette expression.

  1. obtient la citation ouverte qui est de retour référencé plus tard à \1 pour que nous ayons la même citation à proximité
  2. obtient la valeur href
  3. s'il y avait un point d'interrogation, alors il est capturé ici

du code Java Exemple:

Compte tenu échantillon de texte:

<p>Some <a href="http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html">text</a>. I like kittens <a href="mailto:[email protected]">email us</a>Dogs are nice.</p><a href="http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html?attribute=value">remember to vote</a> 

Ce code

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
class Module1{ 
    public static void main(String[] asd){ 
    String sourcestring = "source string to match with pattern"; 
    Pattern re = Pattern.compile("<a\\b[^<]*\\bhref=(['\"])(https?:\\/\\/(?:www[.])?abc[.]com[^\"'?]*?([?]?)[^\"'?]*?)\\1[^<]*<\\/a>",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 
    Matcher m = re.matcher(sourcestring); 
    int mIdx = 0; 
    while (m.find()){ 
     for(int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++){ 
     System.out.println("[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx)); 
     } 
     mIdx++; 
    } 
    } 
} 

Rendements

$matches Array: 
(
    [0] => Array 
     (
      [0] => <a href="http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html">text</a> 
      [1] => <a href="http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html?attribute=value">remember to vote</a> 
     ) 

    [1] => Array 
     (
      [0] => " 
      [1] => " 
     ) 

    [2] => Array 
     (
      [0] => http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html 
      [1] => http://www.abc.com/content/cy-tech/global/en/cq5-reference-materials.s_cid_123.html?attribute=value 
     ) 

    [3] => Array 
     (
      [0] => 
      [1] => ? 
     ) 

) 

De là, il est une simple question de itterating à travers tous les matches, si le groupe 3 a une valeur puis insérez un & sinon puis insérez un ? entre votre nouveau texte et la valeur href du groupe 2.

Responsabilité

Parsing HTML avec regex peut ne pas être la chose la plus facile à maintenir à long terme. Cependant, si vous avez le contrôle sur votre texte d'entrée, le texte reste relativement simple, et vous êtes prêt à avoir le cas de pointe périodique où une expression régulière peut échouer, alors regex fonctionnera pour vous.

Certains ennemis signaleront que les chaînes comme les suivantes ne correspondent pas correctement. Bien que ce soit vrai, en HTML, ces possibilités sont soit illégales, soit peu pratiques et donc peu susceptibles d'être rencontrées.

  • <a href="http://abc.com?attrib=</a>">link</a> les symboles spéciaux supplémentaires </ et > pour travailler en HTML, ils doivent être échappé. Comme indiqué ici, cela viole le standard HTML.
  • <a href="http://abc.com?attrib=value">outside<a href="http://abc.com?attrib=value2">inside</a></a> le lien imbriqué peut être légal, mais il oblige le navigateur à choisir quelle balise d'ancrage est suivie, et je n'ai jamais vu ce format utilisé.
+0

+1 pour l'avis de non-responsabilité – jpaugh

+0

Comment avez-vous créé ce tableau d'état, si je peux demander? – qqilihq

+0

http://stackoverflow.com/a/1732454/1294162 – wazy

Questions connexes