2016-05-13 12 views
-1

Ich habe Text wie diese -mit regulärem Ausdruck und Rekonstruieren ursprüngliche Zeichenfolge

This is a test text. <span> with bold </span> and with <span> italic </span> and so on and so forth. 

Nun, ich diese Regex bin mit allen HTML zu identifizieren <[^>]*> ich dann bin alle HTML mit leeren Zeichenfolge zu ersetzen, so dass die Ergebnis wäre wie dies

This is a test text. with bold and with italic and so and so forth. 

im obigen Text ich Text identifizieren will, sagt sie, „kursiv“ und legen sie spezielle Tags um ihn herum und dann den ursprünglichen Text zu rekonstruieren. So wäre das Ergebnis

This is a test text. <span> with bold </span> and with <span> <span class='special'>italic</span> </span> and so on and so forth. 

I-Code bin zu schaffen, die matcher.start gets() und matcher.end(), um eine Liste aller HTML-Tags zu machen, dann ich denke an dieser reconstrucing basierend Liste. Gibt es einen besseren Weg, es zu tun? Wie würdest du es lösen?

EDIT

Der Grund für die Textsuche nach html ersetzen ist, weil das HTML-interferiert mit dem Text ich suche. So zum Beispiel könnte es so sein

This is a test text. <span> with bold </span> and with <span> it</span>al<span>ic </span> and so on and so forth. 

EDIT2

Dies ist kein Duplikat Frage, wie es vorgeschlagen wird. Stellen Sie sich ein Szenario vor, in dem Sie den HTML-Code, den Sie auf dem Bildschirm sehen, markieren müssen, indem Sie lediglich einen einfachen Bereich mit der Hintergrundfarbe Gelb zum Text Ihrer Wahl hinzufügen. Nun stellen Sie sich vor, dass dieser Text das Wort kursiv ist, aber es erscheint als <span>ita</span>l<span>ic</span>. Meine Frage ist, wie würdest du dieses Wort finden und es dann umspannen?

EDIT3 Letzte Bearbeitung, um die Problemstellung zu vereinfachen. Ich hoffe, das macht es deutlich. Dies ist der Eingang -

This is a test text with <span>it<span>al<span>ic</span> and etc. 

Dies ist die erwartete Ausgabe -

This is a test text with <span class='highlight'><span>it<span>al<span>ic</span></span> and etc. 
+0

Wie würden Sie herausfinden, welcher Text Tags nach dem Ersetzen hatte? – shmosel

+0

aus dem ursprünglichen Text, ich weiß, wo die Tags vorhanden sind, die versetzt. – Jay

+0

Gibt es einen besonderen Grund, die HTML-Tags zu entfernen und sie dann erneut hinzuzufügen? Es scheint effizienter zu sein, nicht zu entfernen/ersetzen. – KevinO

Antwort

1

Dies wird tun, was Sie suchen, aber es nicht erkennt/verhindern fehlerhafte HTML-Generation.

import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class HtmlHighlighter { 
    private final String inputWithoutTags; 
    private final List<Tag> tags; 

    private static class Tag { 
    private final String text; 
    private final int startPos; 

    private Tag(final String text, final int startPos) { 
     this.text = text; 
     this.startPos = startPos; 
    } 
    } 

    public HtmlHighlighter(final String input, final String tagRegex) { 
    final Pattern p = Pattern.compile(tagRegex); 
    tags = new ArrayList<>(); 
    final Matcher m = p.matcher(input); 
    StringBuffer sb = new StringBuffer(); 
    int cursor = 0; 
    int cursorExcludingTags = 0; 
    while (m.find()) { 
     cursorExcludingTags += m.start() - cursor; 
     tags.add(new Tag(input.substring(m.start(), m.end()), cursorExcludingTags)); 
     cursor = m.end(); 
     m.appendReplacement(sb, ""); 
    } 
    m.appendTail(sb); 
    inputWithoutTags = sb.toString(); 
    } 

    public String highlightText(String regexToFind, String openingTag, String closingTag) { 
    final List<Tag> allTags = getAllTags(regexToFind, openingTag, closingTag); 
    return combineTags(allTags); 
    } 

    private List<Tag> getAllTags(final String regexToFind, final String openingTag, final String closingTag) { 
    final List<Tag> ret = new ArrayList<>(tags); 
    final Pattern p = Pattern.compile(regexToFind); 
    final Matcher m = p.matcher(inputWithoutTags); 
    while (m.find()) { 
     addTag(new Tag(openingTag, m.start()), true, ret); 
     addTag(new Tag(closingTag, m.end()), false, ret); 
    } 
    return ret; 
    } 

    private void addTag(final Tag tag, final boolean beforeIgnored, final List<Tag> allTags) { 
    for (int i = 0; i < allTags.size(); i++) { 
     if (allTags.get(i).startPos >= tag.startPos && beforeIgnored) { 
     allTags.add(i, tag); 
     return; 
     } 
     if (allTags.get(i).startPos > tag.startPos) { 
     allTags.add(i, tag); 
     return; 
     } 
    } 
    allTags.add(allTags.size(), tag); 
    } 

    private String combineTags(final List<Tag> allTags) { 
    final StringBuilder sb = new StringBuilder(inputWithoutTags); 
    for (int i = allTags.size() - 1; i >= 0; i--) { 
     final Tag tag = allTags.get(i); 
     sb.insert(tag.startPos, tag.text); 
    } 
    return sb.toString(); 
    } 

    public static void main(String... args) { 
    final HtmlHighlighter highlighter = new HtmlHighlighter("This is a test text with <span>it<span>al<span>ic</span> and etc.", "\\<.*?\\>"); 
    System.out.println(highlighter.highlightText("italic", "<span class='highlight'>", "</span>")); 
    } 
} 
+0

danke, ich hatte etwas ähnliches im Sinn. Ich habe etwas geschrieben, das herausfindet, wo sich die Tags befinden, wo sich der Text befindet (Offsets). Berechnen Sie dann, wie stark der Textoffset beim Ersetzen von HTML-Tags durch eine leere Zeichenfolge geändert wird. Ich werde diesen Code ausprobieren. – Jay

+0

Warum sagen Sie, dass fehlerhafte Erzeugung nicht erkannt/verhindert wird? Mein HTML ist vollständig, es ist nie unvollständig/fehlerhaft. – Jay

+0

Angenommen, Sie möchten "world" in der folgenden Zeichenfolge markieren: ' Hallo wo rld'. ' Hallo wo rld' ist nicht gültig html – Andreas

Verwandte Themen