Reputation: 161
I'm trying to split a string into an array of a lines but it isn't working, this is what I've tried so far -
value = '<p>line1</p><p>line2</p><p>line3</p>';
var lines = value.split('/<p>|<\/p>/');
console.log(lines.length);
//expecting 3 but output is 1
Upvotes: 0
Views: 150
Reputation: 10849
A different approach could be to use native selectors (this implementation works with IE9+)
The idea is to hold your dom string in an actual html document body, and use querySelectorAll
to fetch the paragraphs, transform the NodeList
to an Array
(the type returned by querySelectorAll
). Then use the higher order function Array.prototype.map
to build the array of lines you need.
This may seem overkill, but this is robust if some of your paragraphs happen to have extra attributes.
var sandbox = document.implementation.createHTMLDocument();
sandbox.body.innerHTML = '<p>line1</p><p>line2</p><p>line3</p>';
var paragraphs = Array.prototype.slice.call(sandbox.querySelectorAll('p'));
var lines = paragraphs.map(function (node) {
return node.innerText;
});
Upvotes: 0
Reputation: 2567
You can do that with a Regex.
value = '<p>line1</p><p>line2</p><p>line3</p>';
var v = value.replace(new RegExp("<p>(.*?)<\/p>", "g"), '$1\n');
var lines = v.split("\n");
lines.splice(-1);
console.log(lines);
https://jsfiddle.net/goe14nkf/
This returns your lines correctly: ["line1", "line2", "line3"]
Upvotes: 0
Reputation: 167250
You are doing it wrong. Use it this way:
value = '<p>line1</p><p>line2</p><p>line3</p>';
var lines = value.split('</p><p>');
console.log(lines.length);
Also, to remove the first and last <p>
and </p>
, use the RegEx you have. And for those who ask that:
value = '<p>line1</p><p>line2</p><p>line3</p>';
value = value.replace(/^<p>|<\/p>$/g, "");
var lines = value.split('</p><p>');
console.log(lines.length);
console.log(lines);
Upvotes: 1