2010-07-20 7 views
3

Je veux échapper à toutes les citations qui vient seulement après le texte H1:de regex échapper à des citations

Par exemple,:

H1: "text here" 

devraient devenir:

H1: "text here" 

Ce serait facile avec lookbehind, mais ce n'est pas dans JS.

quelque chose que j'ai essayé:

.replace(/H1:(.*)(")(.*)/ig, "H1:$1"$2") 

En outre, il devrait fonctionner sur un autre texte similaire comme:

H1: ""text here"" 
H1: "text "here"" 
H1: ""text here" 
+4

Pourquoi ne pas remplacer juste tout '" 'par' " 'Quel est le important de' H1:? ' – kennytm

+0

Je dois remplacer seulement après H1:. Le reste ne devrait pas être remplacé – Mark

+0

H1: n'est pas la chaîne entière, la chaîne entière est assez grande et complexe, il y a d'autres '' 'qui ne devraient pas être remplacés. Désolé de ne pas être clair. – Mark

Répondre

0

D'abord, je diviser la chaîne en lignes. Alors je ne faire le remplacement du texte sur les lignes correctes, et pendant que je fais le remplacement du texte que je concaténer toutes les lignes de retour ensemble:

<script type="text/javascript"> 
    // Create a test string. 
var string='H1: "text here" \nH1: test "here" \nH2: not "this" one'; 
    // Split the string into lines 
array = string.split('\n'); 
    // Iterate through each line, doing the replacements and 
    // concatenating everything back together 
var newString = ""; 
for(var i = 0; i < array.length; i++) { 
     // only do replacement if line starts H1 
     // /m activates multiline mode so that^and $ are start & end of each line 
    if (array[i].match(/^H1:/m)) { 
      // Change the line and concatenate 
      // I used &quote; instead of &quote; so that the changes are 
      // visible with document.write 
     newString += array[i].replace(/"/g, '&quote;') + '\n';  
    } else { 
      // only concatenate 
     newString += array[i] + '\n'; 
    } 
} 
document.write(newString); 
</script> 
+0

Pouvez-vous me montrer comment réintégrer les tableaux remplacés dans la chaîne? – Mark

+0

@Mark - J'ai modifié le code afin qu'il produise une chaîne modifiée appelée newString qui contient toutes les lignes d'origine, mais avec la ligne H1 modifiée. –

1

Voici une approche:

function encodeQuotesOccuringAfter(string, substring) { 
    if(string.indexOf(substring) == -1) { 
     return string; 
    } 

    var all = string.split(substring); 
    var encoded = [all.shift(), all.join(substring).replace(/"/g, "&quot;")]; 

    return encoded.join(substring) 
} 

Ce second est un peu inutile , mais vous pouvez déplacer ceci dans une fonction et calculer startAt seulement une fois. L'idée est de chercher toutes les citations, et de ne changer que celles qui ont "H1:" apparaître devant elles.

str.replace(/"/g, function(match, offset, string) { 
    var startAt = string.indexOf("H1:"); 
    if(startAt != -1 && offset > startAt) { 
     return "&quot;"; 
    } 
    else { 
     return '"'; 
    } 
}); 

En utilisant notre connaissance du domaine que H1: ne contient pas de guillemets, nous ne remplaçons simplement sur la chaîne entière.

str.replace(/"/g, "&quot;"); 
+0

Mais cela changera aussi 'H2:" texte ici "' ou 'complètement" aléatoire "des guillemets" ici "', ce que nous ne voulons peut-être pas. Mark dit spécifiquement, qu'il y a quelques marques de citation qui ne devraient pas être changées. –

+0

@Peter - merci de le signaler. Mise à jour de la réponse – Anurag

+0

Pour la seconde, ceci ne vérifie pas si le 'H1:' est sur la même ligne. – Mark

0

essayez ceci:

.replace(/H1:(.*?)(")(.*?)/ig, "H1:$1&quot;$3") 

*? Correspond à 0 ou plus du jeton précédent. Ceci est une correspondance paresseuse, et correspond le moins de caractères possible avant de satisfaire le prochain jeton.

Ceci est le site web que j'utilise pour tester les expressions régulières: http://gskinner.com/RegExr/

+0

Ne fonctionne pas (remplace un seul devis) - mieux vérifier votre solution avant de poster. – Amnon

+0

Merci pour le site. On dirait utile. Mais oui, cela correspond seulement à 1 citation. – Mark

1

scinder le texte en lignes, puis, pour chaque ligne qui commence par " H1 ", faites simplement un remplacement.

Sachez simplement que le & quot; Le caractère peut être remplacé par le moteur JavaScript avec une citation réelle s'il est incorporé dans le code HTML. (Edit: il a été remplacé quand j'ai essayé de l'écrire directement dans cette réponse).

Questions connexes