preg_match - text between closing and opening tag

preg_match array
php preg_match_all html tags
preg_match_all online
php get text between tags

I've very odd task to do.

I need to grab text from html tags using preg_match() function in PHP. Problem is that text I need is between closing and opening html tags or this text with tags.

Below is my html string:

<h2>Title of post</h2> 1 category <strong>task 1</strong> 1 category <strong>task 2</strong> 1 category <strong>task 3</strong>&nbsp; 

To be more specific: I need string " 1 category " between </h2> and <strong> tag.

When i try to grab text between opening and closing tags - It's working fine and I'm using this function:

preg_match_all('#<strong>(.*?)</strong>#',$string,$matches);

I've tried many combinations to get text between closing and opening tags. None of them worked out. I've ended using function like this:

preg_match_all('#<\/strong>(.*?)<strong>#',$content,$matches_all);

With no results.

The strange thins is that on online regex testers this function with above pattern with above function works sometimes.

Do I have bad pattern? Am I missing some flags? Do you know what can be best way to get text in this way? Unfortunately I have to do with Regex approach, the solutions like XMLDomParser is not allowed in my case.

Thanks a lot for help.

Looks like something wrong with your php installation/configuration.

Your code as it's.

$content = '<h2>Title of post</h2> 1 category <strong>task 1</strong> 1 category <strong>task 2</strong> 1 category <strong>task 3</strong>&nbsp;'; 
preg_match_all('#<\/h2>(.*?)<strong>#',$content,$matches);
print_r($matches);

Output:

Array
(
    [0] => Array
        (
            [0] => </h2> 1 category <strong>
        )

    [1] => Array
        (
            [0] =>  1 category 
        )

)

Live demo

Note: Since there is only one match of your pattern ( between </h2> <strong>) you can access like $maches[1][0] or use preg_match.

Get Text Between Tags, This example provides a method of retrieving text from between tags. By using regular expressions with the preg_match() or preg_match_all() functions, The third paragraph is missing a closing <p> tag, however, with the use of DOM and  By using regular expressions with the preg_match() or preg_match_all() functions, the parse is made to work extremely hard as PHP loops over and over the text to find matches. By using the DOM functions the speed is increased dramatically and parsing is much cleaner.

Try this one.

preg_match_all('/<([^>]+)>(?:([^<]+))*(?=[^>]*\<)/',$string,$matches);

Live Demo

preg_match – text between closing and opening tag – GiveMeAns , I've very odd task to do. I need to grab text from html tags using preg_match() function in PHP. Problem is that text I need is between closing  Last visit was: Tue May 05, 2020 5:16 pm: It is currently Tue May 05, 2020 5:16 pm

If you want all pieces of text between a closing and opening tag, you could use this code. Note that I changed your text so that the text between each set of closing/opening tags was different so that it was more obvious that the match was finding each value.

$str = '<h2>Title of post</h2> 1 category <strong>task 1</strong> 2 category <strong>task 2</strong> 3 category <strong>task 3</strong> ';
preg_match_all('#(?:</[^>]+>)(.*?)<#', $str, $matches);
print_r($matches[1]);

Output:

Array
(
    [0] =>  1 category 
    [1] =>  2 category 
    [2] =>  3 category 
)

Capturing Text Inside HTML Tags (PHP Cookbook), You want to capture text inside HTML tags. Bomb</h3>, because the opening tag is an <h2> while the closing tag is not. Using that regular expression on:. Dear Frnd. please find wts the prob. Warning 28 Validation (XHTML 1.0 Transitional): Text is not allowed between the opening and closing tags for element table'.

preg_match_all - Manual, Searches subject for all matches to the regular expression given in pattern and puts them in that matched full pattern, and $out[1] contains array of strings enclosed by tags. offset can be used to specify the alternate place from which to start the search (in bytes). Example #1 Getting all phone numbers out of some text. Jan 27th 2009 - Assuming you need to process a body of HTML content, this article tells you how to manually process code from that content that appears between two tags (e.g. <pre>process me!</pre>). How to match and replace content between two html tags using regular expressions > thatsquality.com

strip_tags - Manual, In PHP 5.3.4 and later, self-closing XHTML tags are ignored and only return preg_replace('@<(\w+)\b. As soon as you accept a single tag (2nd parameter), you are opening up a security hole such as this: $is_allowable: boolean telling if a tag isn't allowed (to avoid double checking), always true for text between tags " Center Text The opening tag for centering is <div align="center">, and the closing tag is </div>. If you do not use the closing tag, then all text after the opening tag will be displayed

13.7. Capturing Text Inside HTML Tags, Capturing Text Inside HTML Tags Problem You want to capture text inside HTML tags. True parsing of HTML is difficult using a simple regular expression. the Bomb</h3> , because the opening tag is an <h2> while the closing tag is not. The text contained between title tags is: Question options: Not displayed by browsers Displayed in the title bar of the browser window Not used by search engines Never seen by your web page visitor.

Comments
  • Why you said it didn't work for you? Input? Output? Expected output?
  • You may prepare some code at ideone.com or similar
  • You can split the string into an array by your first working regex. The resulting array will have " 1 category ". Something like $arr = preg_split("/<(strong|h2)>.*?</(\1)>/", $input);
  • You can try these links: regex101, ideone. Both with a working example.
  • @fabtosz please explain why you are not allowed to use an appropriate tool for this task. 3v4l.org/5BIG4
  • Try this answers do very little to educate the OP and future researchers. Please always, always include some kind of explanation with every answer that you post with the intention to educate.