How do I use JavaScript to detect
<br> <br> <br> to become one
<br> ?
I tried with:
jQuery('body').html().replace(/(\<br\>\r\n){3, }/g,"\n"); but this is not working for me.
If you want to disable the effect of multiple <br> on the page, you can do it by CSS without using JavaScript:
br + br { display: none; } However, this method is ideal when you are working with tags, something like this:
<div>Text</div><br /><br /><br /> <div>Text</div><br /><br /><br /> <div>Text</div><br /><br /><br /> In other cases, like this:
Hello World<br /> <br /> Hello World<br /> <br /> Hello World<br /> <br /> It will fail (as CSS passes text nodes). Instead, use a JavaScript solution.
// It's better to wait for document ready instead of window.onload(). window.onload = function () { // Get all `br` tags, defined needed variables var br = document.getElementsByTagName('br'), l = br.length, i = 0, nextelem, elemname, include; // Loop through tags for (i; i < l - 1; i++) { // This flag indentify we should hide the next element or not include = false; // Getting next element nextelem = br[i].nextSibling; // Getting element name elemname = nextelem.nodeName.toLowerCase(); // If element name is `br`, set the flag as true. if (elemname == 'br') { include = true; } // If element name is `#text`, we face text node else if (elemname == '#text') { // If text node is only white space, we must pass it. // This is because of something like this: `<br /> <br />` if (! nextelem.data.replace(/\s+/g, '').length) { nextelem = br[i+1]; include = true; } } // If the element is flagged as true, hide it if (include) { nextelem.style.display = 'none'; } } }; <br> than expected too, if there are no tags in between: jsfiddle.net/ahMMv/13Simpler:
var newText = oldText.replace(/(<br\s*\/?>){3,}/gi, '<br>');
This will allow optional tag terminator (/>) and also spaces before tag end (e.g. <br /> or <br >).
+ to {3,} as in the other examples will make it work that way. Updated answer....replce() will NOT change the original value. You must assign the return value of the replace method to the original variable.What is the point of sending HTML, which is in a form that you don't want, to the client browser and making it run JavaScript code to clean it up? This looks like a bad design.
How about fixing all your static HTML, and HTML generation, so that these superfluous <br> elements do not occur in the first place?
If you use JavaScript to modify the document object, do so for dynamic effects that cannot be achieved in any other way.
<br> tags were already created by Javascript.This solution is jQuery + DOM only, does not manipulate HTML as string, works with text nodes, ignores whitespace only text nodes:
$('br').each(function () { const {nodeName} = this; let node = this; while (node = node.previousSibling) { if (node.nodeType !== Node.TEXT_NODE || node.nodeValue.trim() !== '') { break; }; } if (node && node !== this && node.nodeName === nodeName) { $(node).remove(); } }); while (node = node.previousSibling) { if (node.nodeType !== Node.TEXT_NODE || node.nodeValue.trim() !== '') { break; }; }Wouldn't something like this be the right approach:
$("br~br").remove() EDIT: No, it's wrong, because its definition of "contiguous" is too loose, as per BoltClock.
<br> in <br><hr><br><hr>, despite the <br> elements not being contiguous. Depending on the use case, this may not be desirable.Try this
$('body').html($('body').html().replace(/(<br>)+/g,"<br>")); It will replace n number of <br> into one.
.replace(/(<br\s*/?>\s*)+/g, "<br>\n") it handles all sorts of breaks with all sorts of spacing. Also, the replace also breaks the line afterward. I'd suggest replacing with <br />\n, but his apparrent preference isn't self-closing.body will be removed. This is not a good idea to my mind.A lot of the other answers to this question will only replace up to certain amount of elements, or use complex loops. I came up with a simple regex that can be used to replace any number of <br> tags with a single tag. This works with multiple instances of multiple tags in a string.
/(<br>*)+/g To implement this in JavaScript, you can use the String.replace method:
myString.replace(/(<br>*)+/g, "<br/>"); To replace multiple <br/> tags, add a / to the regex:
/(<br\/>*)+/g Try this:
jQuery('body').html( jQuery('body').html().replace(/(?:<br>\s+){3,}/ig,"\n")); ); DEMO: jsfiddle
<br>, why are they there in the first place?