Since you can't use negative lookbehinds in JavaScript, how would you achieve the same regex match without one, using a lookahead or some other JavaScript supported method?
(?<!<\/strong>\n\s{4}|<\/strong> \n\s{4})<br>
I'm trying to find all <br>
tags that are not preceded by </strong>
and </strong>
followed by a line break and a series of whitespace chars.
Here's my code and some sample text for testing. I got it working in pcre with the lookbehind but I can't figure out how to make it work in JavaScript.
I've tried the other examples here but I was unable to figure out how to implement those solutions according to my needs.
UPDATE Javascript lookbehinds are coming in ES2018!
A non-regular expression approach
When parsing HTML, I prefer to convert HTML into DocumentFragments. This allows me to use common querySelector methods and JS functions to achieve my end goal.
I replace the 3 br tags with a the following: <div>REPLACED</div>
. Also, in order to create the fragment, I used the npm package html-fragment
.
const html = `<p><strong>It was a weak bit.</strong>
<br>Because it’s already been done. If he had been like, “I don’t know, do you want to go to the La Brea tar pits and scoop some tar out and give ourselves a facial and burn ourselves and then only be able to know each other?” I would be like, “Haa, what?! Okay.” I mean, something new is going on here. He basically did the equivalent of like when guys do “fat guy in a little coat,” and they act like it’s not a Chris Farley callback. It’s like, this is a joke that’s in our system, so you’re a little bit unoriginal or even worse, you don’t know you’re unoriginal. </p>
<p><strong>Does he know it’s you?</strong>
<br>I do think he knew that I was a comedian named Jenny. So anyway, he’s like, “Let’s go to the Renaissance fair,” and I call my friends, and I’m like, “I’m not going on this date.” And they’re like, “Oh Jenny, come on, don’t be so closed down, you need to get out there.” I’m like, “UGH, fine.” Then we have a series of text messages back and forth that I’m just kind of like, <em>What is this? Is this what dating is like?</em> I was with my ex-husband for nine years, then I was in a very serious relationship that was passionate for a year, and I’m like, I don’t know, maybe I just don’t know what’s going on. And he’s asking me these questions that I’m like, What. The. Fuck. Why don’t you just wait?</p>
<p><strong>What is he asking you?</strong>
<br>Like, “Where was the last place you flew on an airplane?” And I’m not a rude or cruel woman, but I was like, I don’t... dude... just wait. Sit me down, I’ll tell you anything, just wait. Just wait until Saturday.</p>
<p><strong>Also, that’s the kind of question that is like, “I’m gonna go on the internet and search random questions to ask someone.”</strong>
<br>Yeah, it’s not great. It’s a real speed-dating question. I would love it in other circumstances if it was like a page in <em>Entertainment Weekly</em>, you know? So then I’m like, “I made us a reservation at this restaurant, will you meet me there?” He’s like, “Yes, is it fancy?” I’m like, “No,” and he’s like, “Okay, should I wear something like this?” And he sends me a picture of a knight’s costume. Like from the Renaissance fair. At which point I’m like what the fuck, dude? Because I didn’t even jump on this riff in the first place. It’s not like I was like, “Yes, and I will wear my wench's costume and bring a cup of mead!” I’m just like... Heh?! What? Why are you doing this?</p>
<p><strong>You didn’t respond positively to the bit.</strong>
<br>Never. Anyway, on the day of the date, I was like, “How will I know it’s you?” And I thought he would be like, “I’m 6’1” and I’ve got a beard,” or some
<p><br></p>
<p><br></p>
<p><br></p>`;
const fragment = HtmlFragment(html);
Array.from(fragment.querySelectorAll('br'))
.filter(br => {
let previous = br.previousElementSibling;
return (previous === null || previous.nodeName !== 'STRONG');
})
.forEach(br => {
let div = document.createElement('div');
div.innerText = 'REPLACED';
br.parentNode.replaceChild(div, br);
});
let div = document.createElement('div');
div.appendChild(fragment);
console.log(div.innerHTML);
<script src="https://unpkg.com/html-fragment@1.1.0/lib/html-fragment.min.js"></script>