Regex. Find a paragraph containing a word

In the text:

<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>

I need to find paragraphs (between tags p

) that contain the string "TEXT".
I tried <p>.*?(TEXT).*?<\/p>


and I tried <p>(?!<p>).*?(TEXT).*?<\/p>

But that doesn't solve the problem.

+3


source to share


4 answers


((?!<\/p>).)*(TEXT)

to make sure the "Text" in one <p></p>

Watch the demo



var regex = /<p>((?!<\/p>).)*?(TEXT).*?<\/p>/g;
var text = '<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>';
console.log(text.match(regex));
      

Run codeHide result


+3


source


The first one you wrote works for me when I try to use it in a strong text search string with regex activated.

<p>.*?(TEXT).*?<\/p> 

      

You just need to add a start and end separator like (...) or {...} or /.../ or [...]. Try this:



/<p>.*?(TEXT).*?<\/p>/ 

      

I think without delimiters this is just a pattern and with them this is a regex in javascript ... Add "i" after it for case insensitive search

/<p>.*?(TEXT).*?<\/p>/i

      

+1


source


Since this is a string (it's called @Rajesh), just create an element div

and add it.

get all tags p

using querySelectorAll

and then use the function forEach

.

Check innerHTML

for /TEXT/

and, if found, insert it into the array.

In the program below, the array a

contains two matching tags

var str="<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>";
var div=document.createElement("div");
div.innerHTML=str;
var a=[];
div.querySelectorAll("p").forEach(x=>{if(/TEXT/.test(x.innerHTML)) a.push(x);});
console.log(a);
      

Run codeHide result


If you don't want tags <p></p>

, just clicktextContent

var str="<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>";
var div=document.createElement("div");
div.innerHTML=str;
var a=[];
div.querySelectorAll("p").forEach(x=>{if(/TEXT/.test(x.innerHTML)) a.push(x.textContent);});
console.log(a);
      

Run codeHide result


0


source


You can try something like this:

  • Create regex to get all groups.
  • Loop through these regular expressions to check the required search key and filter out matches.

var str = "<p>1 bla bla <em>bla</em> bla bla</p><p>2 bla bla <em>bla</em> bla TEXT bla</p><p>3 bla bla <em>bla</em> bla bla</p><p>4 bla bla <em>bla</em> bla TEXT bla</p><p>5 bla bla <em>bla</em> bla bla</p>";

var groupRegex = /(?:^|<p>)(.*?)(?:<\/p>|$)/g;
var searchRegex = /text/i
var groups = str.match(groupRegex);

var result = groups.filter(function(s){ return searchRegex.test(s) })

console.log(result)
      

Run codeHide result


-1


source







All Articles