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.
source to share
((?!<\/p>).)*(TEXT)
to make sure the "Text" in one <p></p>
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));
source to share
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
source to share
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);
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);
source to share
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)
source to share