Wie kann ich sicherstellen, dass redundante
-Tags nicht das Styling brechen?
Frage
Ich bekomme ein unzuverlässiges Ergebnis aus der Tumblr -API. Wenn ich eine einzelne Textzeile bekomme, erhalte ich nur den Text. Wenn es mehrere Zeilen gibt, ist jede Zeile in a eingewickelt <p>
Schild. Also bekomme ich entweder:
This is a value with no second line
oder
<p>This is a value</p>
<p>with a second line</p>
Ich möchte, dass beide gleich erscheinen. Ich habe das manuell hinzugefügt <p>
um den Wert um den Wert, aber dies wird zu:
<p><p>This is a value</p>
<p>with a second line</p></p>
auf Mehrzeilenwerte.
Ich habe ein paar Gedanken darüber, wie ich das beheben kann, bin mir aber nicht sicher, welches das Beste wäre.
- Erstellen Sie einen neuen CSS -Stil
p p {}
so dass das durcheinander - Verwenden Sie JQuery, um DOM -Inhalte von redundant zu nehmen
<p>
Tags und machen sie nicht redundant - Laden Sie den Text einfach in eine JQuery -Funktion und prüfen Sie, ob es vorhanden ist
<p>
Tags, fügen Sie sie hinzu, wenn nicht, und schreiben Sie das Ergebnis in das DOM.
Ich bin mir nicht sicher, ob Option 1 sehr gut funktioniert (insbesondere in den Browsern), und es scheint ein bisschen hackig. Irgendwelche Ideen, ob entweder Option 2 oder 3 besser ist und wie ich implementieren würde?
Bearbeiten: hätte erwähnen, dass ich mit einem Tumblr -Thema spiele, also stehen mir Python/PHP/ASP/etc nicht zur Verfügung (das würde es mir einfacher machen!).
Lösung
Passen Sie es zuerst an:
result = /^\s*\<p\>.+\<\/p\>$/.test(result) ? result : '<p>' + result + '</p>';
Anstatt die Tags ständig hinzuzufügen.
Andere Tipps
Warum nicht nur
if ( str.indexOf('<p>') === -1 ) {
str = '<p>' + str + '</p>';
}
Also, wenn es kein einziges Ereignis der "<p>"
Zeichenfolge in Ihrer Zeichenfolge, dies bedeutet, dass das Ergebnis "Single-Line" ist und Sie es einwickeln müssen "<p>"
Stichworte.
Ich denke, Option 3 ist der beste Weg. Ich habe jedoch eine andere Idee, die nützlich sein könnte:
Ich bin mir nicht sicher, auf welcher Plattform Sie sich entwickeln (PHP/ASP.NET/etc ..), und Sie könnten dies wahrscheinlich auch im vorderen Ende tun.
- Empfangen Sie die Nachricht (1 oder mehr Zeilen)
- Verwenden Sie Ihre Plattformen
split
Funktion zum Aufteilen der Zeichenfolge in ein Array basierend auf einer Suche nach dem Newline -Zeichen - durch Arraywerte iterieren und alle entfernen
<p>
's, wenn es welche gibt - erneut iterieren und vorbereiten und anhängen a
<p> </p>
zu jedem Array -Index - Schneiden Sie jede Array -Zeichenfolge in eine Zeichenfolge ab und geben Sie an die DOM aus
Viola! Ob seine 1 Zeile oder 10 Zeilen, nein <p>
's oder 10 <p>
Sie können sich auf die Funktionalität verlassen.
Diese Methode würde dieses Segment Ihrer Anwendung "zukunftssicher" "
Annahme von PHP; und wenn das String -Format konsistent ist ~
$str = 'hello world';
//$str = '<p>a string with a p tag</p>';
if(substr($str,0,3)=='<p>') {
echo $str;
} else {
echo '<p> ' . $str . '</p>';
}
// <p>hello world</p>
// <p>a string with a p tag</p>
Eine andere Lösung könnte sein, alle zu ersetzen /<\/p>[^<]*<p>/g
mit <br/>
Dies würde Linienbrüche in multiline Absätzen bewahren.