this is example of some string.
<div>other text</div> some text abc , <div>need_match_this</div> bbbb <p>hsa</p> aa <span>hello</span>
I know only end of string "<span>hello</span>"
and I need to match text in closest "above" div.
I used this regex:
\<div\>(.*?)\<\/div\>.*?\<span\>hello\<\/span\>
But this is not working for me because I need to return text of closest div only, not first div in string.
Is there any regex solution to resolve this?
Please help.
Thank you
You need to use a negative lookahead based regex instead of in-between .*?
, since .*?
would also match opening or closing div
tags.
<div>((?:(?!<\/?div>).)*?)<\/div>(?:(?!<\/?div>).)*?<span>hello<\/span>
DEMO
(?:(?!<\/?div>).)*?
forces the regex engine to match any character but not of <div>
or </div>
. That is, before matching each character, this regex would check for that particular character is not the starting character in <div>
or </div>
. If yes, then it would match that particular character. If no, match will fail abruptly and the following character won't be matched.
Example:
string - <div></div>
regex - <div>((?:(?!<\/?div>).)*?)<\/div>
For this input, the above mentioned regex would capture the in-between empty string (ie, the empty string exists between the opening and closing div
tags). (?!<\/?div>).
in the above would check for the following char must not be a starting char in <div>
or </div>
but this fails since the following char is <
which is a staring char in </div>
. Because we defined this particular regex to repeat zero or more times, (?:(?!<\/?div>).)*?
, it captures the in-between empty string.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With