2010-09-28 8 views
8

Fondamentalmente ho solo bisogno dell'effetto di copiare quell'HTML dalla finestra del browser e incollarlo in un elemento textarea.Qual è il modo più conveniente per convertire l'HTML in testo normale preservando le interruzioni di riga (con JavaScript)?

Per esempio io voglio questo:

<p>Some</p> 
<div>text<br />Some</div> 
<div>text</div> 

per diventare questo:

Some 
text 
Some 
text 
+0

Il problema che si sta andando ad avere è l'ordine viene visualizzato il testo. Il modo in cui viene definito qualcosa non è sempre correlato alla gerarchia dei markup. – AutoSponge

+1

possibile duplicazione di [Elimina HTML da testo JavaScript] (http://stackoverflow.com/questions/822452/strip-html-from-text-javascript) – bdukes

risposta

14

Se questo HTML è visibile all'interno della vostra pagina web, si potrebbe fare con la selezione dell'utente (o solo un TextRange in IE). Ciò preserva le interruzioni di riga, se non necessariamente conduce e trascina lo spazio bianco.

UPDATE 10 dicembre 2012

Tuttavia, il metodo di Selection oggetti toString() è not yet standardized e funziona in modo incoerente tra i browser, quindi questo approccio si basa su un terreno infido e Non consiglio di usarlo ora. Cancellerei questa risposta se non fosse accettata.

Demo: http://jsfiddle.net/wv49v/

Codice:

function getInnerText(el) { 
    var sel, range, innerText = ""; 
    if (typeof document.selection != "undefined" && typeof document.body.createTextRange != "undefined") { 
     range = document.body.createTextRange(); 
     range.moveToElementText(el); 
     innerText = range.text; 
    } else if (typeof window.getSelection != "undefined" && typeof document.createRange != "undefined") { 
     sel = window.getSelection(); 
     sel.selectAllChildren(el); 
     innerText = "" + sel; 
     sel.removeAllRanges(); 
    } 
    return innerText; 
} 
+0

Voto positivo per una soluzione intelligente. Perché tutto il sollevamento pesante? –

+0

Grazie. È interessante notare che in caso di non-IE (primo blocco) ottiene ciò che verrebbe copiato negli appunti, ma nel caso IE (secondo blocco) non è la stessa stringa. –

+0

Qual è la differenza tra le stringhe IE e non-IE? Il primo blocco usa il metodo 'toString()' di Selection per estrarre solo il testo della selezione (piuttosto che il rich text che viene copiato negli appunti), quindi dovrebbero essere più o meno identici. –

3

Questo potrebbe rispondere alla tua domanda: Strip HTML from Text JavaScript

+0

La soluzione proposta non conserva interruzioni di riga. –

+0

Altre soluzioni proposte su quella domanda si occupano di interruzioni di linea però :) – clifgriffin

+1

fanno?Non potevo vederne uno che funzionasse. –

0

tre fasi.

First get the html as a string. 
Second, replace all <BR /> and <BR> with \r\n. 
Third, use the regular expression "<(.|\n)*?>" to replace all markup with "". 
+0

Sfortunatamente, questo approccio ignora le interruzioni di riga che emergono tra due paragrafi o div. –

+0

Non è così facile risolvere inserendo un'interruzione forte dopo ogni chiusura di tag P e DIV prima di sostituire la regex? – Serapth

+0

Bene, il problema è un po 'più profondo. Ho bisogno di ottenere del testo che assomigli a quello che l'utente vede su uno schermo. Ad esempio, se ci sono due paragrafi (elementi 'p') ed entrambi hanno un margine standard, voglio ottenere due interruzioni di riga tra i frammenti di testo corrispondenti. Ma quando il margine è 0, deve essere una singola interruzione di riga. Ecco come funzionano gli appunti, almeno in alcuni browser. –

3

Ho provato a trovare un codice che ho scritto per un po 'di tempo che ho usato. Ha funzionato bene. Lasciatemi delineare cosa ha fatto, e si spera che potresti duplicare il suo comportamento.

  • Sostituire le immagini con testo alt o titolo.
  • Sostituisci collegamenti con "testo [collegamento]"
  • Sostituire elementi che generano in genere lo spazio bianco verticale. h1-h6, div, p, br, hr, ecc. (Lo so, lo so. Potrebbero trattarsi di elementi inline, ma funziona bene.)
  • Elimina il resto dei tag e sostituiscilo con uno vuoto stringa.

Si potrebbe anche espandere ulteriormente questo per formattare le cose come liste ordinate e non ordinate. Dipende davvero solo da quanto lontano vorresti andare.

EDIT

Trovato il codice!

public static string Convert(string template) 
{ 
    template = Regex.Replace(template, "<img .*?alt=[\"']?([^\"']*)[\"']?.*?/?>", "$1"); /* Use image alt text. */ 
    template = Regex.Replace(template, "<a .*?href=[\"']?([^\"']*)[\"']?.*?>(.*)</a>", "$2 [$1]"); /* Convert links to something useful */ 
    template = Regex.Replace(template, "<(/p|/div|/h\\d|br)\\w?/?>", "\n"); /* Let's try to keep vertical whitespace intact. */ 
    template = Regex.Replace(template, "<[A-Za-z/][^<>]*>", ""); /* Remove the rest of the tags. */ 

    return template; 
} 
+0

Erm ... non è Javascript vero? Inoltre, non risponde direttamente alla domanda, dato che la domanda riguarda davvero copia e incolla –

+2

Il linguaggio non ha davvero importanza, è come se ne sta andando. Questo potrebbe essere facilmente portato su JS. Sto solo mostrando qualcosa che ho fatto in passato. –

+0

Grazie. E 'abbastanza simile. Anche se, sfortunatamente, il risultato non è esattamente ciò che l'utente vede. Ad esempio, Convertire ('

Alcuni

testo

') e convertire ('

Alcuni

testo

') danno risultati diversi, mentre il browser rende quelli nello stesso modo. –

Problemi correlati