2016-06-04 16 views
-1

ich eine JavaScript-Funktion verwenden wie folge eine HTML-Blockquote auf einen Abschlag Blockquote zu konvertieren:regex ersetzen Zeichenfolge mit Dollarzeichen, Sonderbare Ausgang

function convertBlockquote(str) { 
     var r = str; 

     var pat = /<blockquote>\n?([\s\S]*?)\n?<\/blockquote>/mi; //[\s\S] = dotall; ? = non-greedy match 
     for (var mat; (mat = r.match(pat)) !== null;) { 
      mat = mat[1] 
      .replace(/\n/gm, '\n> ') 
      .replace(/<p>/igm, '\n> ') 
      .replace(/<\/p>/igm, '\n> \n> ') 
      .replace(/(\n> ?){3,}/gm, '\n> \n> '); 
      r = r.replace(pat, '\n>' + mat + '\n'); 
     } 
     return r; 
    } 

Also, wenn ich gehe in: <blockquote>Price: $1000 plus tax.</blockquote>
Ich würde erwarten: > Price: $1000 plus tax.
Aber ich bekomme: > Price: Price: $1000 plus tax.000 plus tax.

Beachten sie, wie es $1 im $ 1000 Teil der Zeichenfolge mit der gesamten ursprünglichen Zeichenfolge ersetzt?

Wie kann ich dies umgehen oder die Funktion aktualisieren, um dies zu handhaben (und andere spezielle Zeichen, die ähnliche Probleme verursachen könnten)?

+0

Sind Sie auf der Suche [** für dieses **] (https://regex101.com/r/nJ4tO2/1), dh die Tags loswerden? – Jan

+0

Nein, es ist eine rudimentäre Möglichkeit, bestimmte HTML-Tags durch "Markdown" -Syntax zu ersetzen. – GWR

Antwort

1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace:

Sie eine Funktion als zweiten Parameter angeben können. In diesem Fall wird die Funktion aufgerufen, nachdem die Übereinstimmung ausgeführt wurde. Das Ergebnis der Funktion (Rückgabewert) wird als Ersetzungszeichenfolge verwendet. (Hinweis: die oben genannten speziellen Ersatzmuster haben nicht in diesem Fall keine Anwendung.)

So können Sie

r = r.replace(pat, function() { return '\n>' + mat + '\n'; }); 
0

schreiben Fehle ich etwas offensichtlich oder die Umsetzung sieht kompliziert?

Das ist, wie ich das tun würde:

str=str.replace(/<blockquote>(.*?)<\/blockquote>/g,'> $1') 

Falls Sie die mehrzeilige möchten zitiert abgestimmt werden:

str=str.replace(/<blockquote>((.|\n)*?)<\/blockquote>/g,'> $1') 
+0

Das war ein wirklich einfaches Beispiel, um zu illustrieren, was gerade geschah. Dies ist eine rudimentäre Funktion, um ein blockquote-Tag und seinen Inhalt durch eine markdown-formatierte Version des Inhalts zu ersetzen. Die zusätzliche "Komplikation" ist für die Behandlung von Fällen, die nicht eine einzige Zeile sind. – GWR

+0

@robar Editiert, um mit Zeilenumbrüchen umgehen zu können. – nicael